복붙노트

[REDIS] 레디 스 설정하고 해결의 관계를 분류

REDIS

레디 스 설정하고 해결의 관계를 분류

나는 레디 스는 내가 일하고 있어요 프로젝트에 대한 순위를 저장하도록 설정 소트 사용하고 있습니다. 우리는 예상하지 않은 (!) 우리가 관계를 처리하고 싶었 방법에 대해 설명합니다. 레디 스이의 경우에 이렇게 예를 들어, 사 전적으로 동일한 점수가 항목,하지만 우리는 대신에 같은 점수가 모든 항목에 동일한 순위를 부여한다 싶지 정렬

redis 127.0.0.1:6379> ZREVRANGE foo 0 -1 WITHSCORES
1) "first"
2) "3"
3) "second3"
4) "2"
5) "second2"
6) "2"
7) "second1"
8) "2"
9) "fifth"
10) "1"

우리는 따라서, 제 3 또는 제 4 위치에 항목이없는 위치 (5)을 가지고 제 2 위치 모두 갖는 second1로서, 두번째 2 및 second3 고려하고 싶다. ZREVRANK은 내가 찾고 있어요 수를 얻을 수있는 가장 좋은 방법은 무엇입니까, 여기에 유용하지 않다?

해결법

  1. ==============================

    1.그것은 하나의 방법은 조금 루아 스크립트를 작성하고 EVAL 명령을 사용한다 날 것으로 보인다. 생성 동작은 여전히 ​​대수 복잡도를 갖는다.

    그것은 하나의 방법은 조금 루아 스크립트를 작성하고 EVAL 명령을 사용한다 날 것으로 보인다. 생성 동작은 여전히 ​​대수 복잡도를 갖는다.

    예를 들어, 우리가 두번째 2의 위치에 관심이있는 가정합니다. 스크립트에서, 첫째 우리는 그 다음 우리가 second3을 획득, ZRANGEBYSCORE을 사용하여 해당 점수의 첫 번째 항목을 얻을 2. 취득, ZSCORE과의 점수를 얻을. 우리가 후하고있는 위치는 다음 second3 플러스 1의 ZREVRANK입니다.

    redis 127.0.0.1:6379> ZSCORE foo second2
    "2"
    redis 127.0.0.1:6379> ZREVRANGEBYSCORE foo 2 2 LIMIT 0 1
    1) "second3"
    redis 127.0.0.1:6379> ZREVRANK foo second3
    (integer) 1
    

    스크립트 같은 것을 할 수 있도록

    local score = redis.call('zscore', KEYS[1], ARGV[1])
    if score then
      local member = redis.call('zrevrangebyscore', KEYS[1], score, score, 'limit', 0, 1)
      return redis.call('zrevrank', KEYS[1], member[1]) + 1
    else return -1 end
    
  2. from https://stackoverflow.com/questions/14944279/redis-sorted-set-and-solving-ties by cc-by-sa and MIT license