2012-10-13 4 views
2

redis에서 정렬 된 세트를 사용하여 리더 보드를 구현했습니다. 동일한 점수를 가진 사용자가 시간 순서대로 정렬되기를 원합니다. 즉, 먼저 왔던 사용자의 순위가 더 높아야합니다. 현재 redis는 사전 식 순서를 지원합니다. 이를 무시할 수있는 방법이 있습니까? 모바일 번호는 정렬 된 집합의 구성원으로 사용됩니다.Redis zrevrangebyscore, 사전 순 외의 정렬

내가 생각한 한 가지 해결책은 모바일 번호 앞에 타임 스탬프를 추가하고 모바일 번호와 타임 스탬프를 매핑하는 해시를 유지하는 것입니다.

$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**score: 400 
key for user2 = 201210121253**26**09313123523 score: 400 (3 seconds later) 

zrevrangebyscore를 사용하면 user2가 user1보다 높게 배치됩니다. 지금은 올바른 순서로 목록 users_with_same_score

users_with_higher_score_count = $redis.zcount("mysset", "(400", "+inf") 
users_with_same_score = $redis.zrangebyscore("mysset", "400", "400") 

:

그러나, 원하는 순위를 얻을 수있는 방법이있다. 인덱스를 보면 사용자의 순위를 계산할 수 있습니다.

리더 보드를 얻으려면. 나는 50의 간격으로 회원을 얻고 루비 코드를 통해 주문할 수있다. 그러나 그것은 좋은 방법으로 보이지 않습니다.

더 나은 접근 방법이 있는지 알고 싶습니다. 또는 솔루션 I에서 만들 수있는 모든 개선 사항.

미리 도움을 주셔서 감사합니다.

P. 점수가 외부 무게는 sort 명령의 기능 50

답변

3
정렬 된 세트의 점수가 배정 밀도 부동 소수점 숫자를 지원

당신의 구세주 아마도 더 나은 해결책은 redis 점수를 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") 

더 자세히이 질문을 참조 : Unique scoring for redis leaderboard

+0

감사합니다. 흥미로운 솔루션입니다. – goyalankit

+0

안녕 할리, 스코어가 점수가 아니고 카운트 숫자 인 경우이 경우 엔 어떻게해야합니까? 수동으로해야할까요? – Maziyar

+0

Maziyar 나는 당신의 질문을 완전히 이해하지 못한다. 그러나 나는 당신이 그것을 'incrby'를 위해 더 이상 정수가 아니라고 말하고 있다고 생각 하는가? 배정도 부동 소수점 숫자와 함께 작동하는'zincrby' 명령이 있습니다. –

0

의 배수에있는 것은 그래서, 여기


SORT mylist BY weight_* 

http://redis.io/commands/sort

+0

흥미로운, 나는 레디 스에서 목록을 사용한 적이 없으니까. 나는 그것을 조사 할 것이다. – goyalankit