복붙노트

[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. ==============================

    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. ==============================

    2.외부 가중치는 당신의 구세주가 여기에 sort 명령의 기능

    외부 가중치는 당신의 구세주가 여기에 sort 명령의 기능

    
    SORT mylist BY weight_*
    

    http://redis.io/commands/sort

  3. ==============================

    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에)

  4. from https://stackoverflow.com/questions/12874181/redis-zrevrangebyscore-sorting-other-than-lexicographical-order by cc-by-sa and MIT license