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
감사합니다. 흥미로운 솔루션입니다. – goyalankit
안녕 할리, 스코어가 점수가 아니고 카운트 숫자 인 경우이 경우 엔 어떻게해야합니까? 수동으로해야할까요? – Maziyar
Maziyar 나는 당신의 질문을 완전히 이해하지 못한다. 그러나 나는 당신이 그것을 'incrby'를 위해 더 이상 정수가 아니라고 말하고 있다고 생각 하는가? 배정도 부동 소수점 숫자와 함께 작동하는'zincrby' 명령이 있습니다. –