[REDIS] 레디 스는 사전 순 이외의 정렬, zrevrangebyscore
REDIS레디 스는 사전 순 이외의 정렬, zrevrangebyscore
나는 레디 스의 정렬 된 세트를 사용하여 리더 보드를 구현했습니다. 나는 같은 점수 사용자가 시간 순으로 정렬 할 수 즉, 처음 온 사용자가 더 높은 순위를해야합니다. 현재 지원에게 사전 식 순서를 레디 스. 그를 오버라이드 (override) 할 수있는 방법이있다. 모바일 번호는 소트 세트의 구성원으로 사용되고있다.
내가 휴대 전화 번호의 앞 타임 스탬프를 추가하고 휴대 전화 번호와 타임 스탬프를 매핑하는 해시를 유지하고 생각하는 것이 하나 개의 솔루션.
$redis.hset('mobile_time', '1234567890', "#{Time.now.strftime('%y%m%d%H%M%S')}")
pref = $redis.hget('mobile_time, '1234567890'')
$redis.zadd('myleaderboard', "1234567890:#{pref}")
그런 식으로 나는 해시에서 접두사를 추가하여 인스턴스에서 특정 사용자에 대한 순위를 얻을 수 있습니다.
지금 이것은 내가 원하는 정확하게하지 않습니다. 이것은 내가 원하는의 반대를 반환합니다. 초기되어 사용자 이상 (동일 점수) 제공 사용자 아래에 배치됩니다.
Key for user1 = 201210121953**23**01234567890 score: 400
key for user2 = 201210121253**26**09313123523 score: 400 (3 seconds later)
내가 zrevrangebyscore를 사용하는 경우, 사용자 2는 사용자 1 이상 배치됩니다.
그러나 원하는 순위를 얻을 수있는 방법이있다 :
users_with_higher_score_count = $redis.zcount("mysset", "(400", "+inf")
users_with_same_score = $redis.zrangebyscore("mysset", "400", "400")
지금은 올바른 순서로 목록 users_with_same_score 있습니다. 인덱스 보면 나는 사용자의 순위를 계산할 수 있습니다.
리더 보드를 얻을 수 있습니다. 나는 50의 간격으로 멤버를 얻고 루비 코드를 통해 주문할 수 있습니다. 그러나 좋은 방법이 될 것 같습니다하지 않습니다.
나는 그것을 할 수있는 더 좋은 방법이 있는지 알고 싶습니다. 또는 솔루션에서 할 수있는 개선은 내가 작정.
당신의 도움에 미리 감사드립니다.
추신 점수는 50의 배수에
해결법
-
==============================
1.배정 밀도 부동 소수점 숫자를 정렬 된 세트 지원의 점수는, 그래서 아마도 더 나은 솔루션은 레디 스가 highscore.timestamp로 점수를 저장하는 것입니다
배정 밀도 부동 소수점 숫자를 정렬 된 세트 지원의 점수는, 그래서 아마도 더 나은 솔루션은 레디 스가 highscore.timestamp로 점수를 저장하는 것입니다
예를 들면 (의사)
highscore = 100 timestamp = now() redis.zadd('myleaderboard', highscore + '.' + timestamp, playerId)
이것은 또한 분류가 다음에 따라 그 높은 점수를 달성 시간을 기준으로합니다 같은 높은 점수를 달성하는 여러 플레이어를 의미
플레이어 1 ...
redis.zadd('myleaderboard', '100.1362345366', "Charles")
플레이어 2의 ...
redis.zadd('myleaderboard', '100.1362345399', "Babbage")
레디 스의 리더 고유의 득점이 더 많은 세부 사항에 대한 질문을 참조
-
==============================
2.외부 가중치는 당신의 구세주가 여기에 sort 명령의 기능
외부 가중치는 당신의 구세주가 여기에 sort 명령의 기능
SORT mylist BY weight_*
http://redis.io/commands/sort
-
==============================
3.당신이 점수의 내림차순으로 리더를 표시하는 경우, 나는 위의 솔루션이 작동합니다 생각하지 않습니다. System.nanoTime ()처럼 최종 점수 코드해야합니다 그래서 - 대신 그냥 점수에 타임 스탬프를 추가 당신이로부터 Long.MAX_VALUE을 추가한다 -
당신이 점수의 내림차순으로 리더를 표시하는 경우, 나는 위의 솔루션이 작동합니다 생각하지 않습니다. System.nanoTime ()처럼 최종 점수 코드해야합니다 그래서 - 대신 그냥 점수에 타임 스탬프를 추가 당신이로부터 Long.MAX_VALUE을 추가한다 -
highscore = 100 timestamp = Long.MAX_VALUE - System.nanoTime(); redis.zadd('myleaderboard', highscore + '.' + timestamp, playerId);
당신이 redis.zrevrange 호출 할 때 이제 올바른 순서를 얻을 것이다 ( 'myleaderboard'를 시작 인덱스, endIndex에)
from https://stackoverflow.com/questions/12874181/redis-zrevrangebyscore-sorting-other-than-lexicographical-order by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 어떻게 레디 스에서 루아 스크립트의 실행 시간을 결정? (0) | 2020.01.17 |
---|---|
[REDIS] 레디 스, Node.js를, 그리고 Socket.io : 크로스 서버 인증과 이해 Node.js를 (0) | 2020.01.17 |
[REDIS] 내 잘못 - EM ::의 Synchrony # 싱크 원인 '루트 섬유'FiberError의 간단한 사용? (0) | 2020.01.17 |
[REDIS] Stackexchange.Redis 시간 제한 및 socketfailures (0) | 2020.01.17 |
[REDIS] , 레디 스 또는 MongoDB를 한 번에 카운터 수백 증가? (0) | 2020.01.17 |