2013-02-18 5 views
4

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" 

의 경우 예를 들어 우리가 원하는, 그래서 같은 점수를 가지고 있지만, 우리는 대신에 같은 점수가 모든 항목에 동일한 순위를 부여 할 일은 원하는 항목 second1, second2second3을 모두 위치 2로, fifth을 위치 5로 간주하십시오. 따라서 세 번째 또는 네 번째 위치에 항목이 없습니다. ZREVRANK은 유용하지 않으므로 원하는 번호를 얻는 가장 좋은 방법은 무엇입니까?

답변

4

한 가지 방법은 약간의 루아 스크립트를 작성하고 EVAL 명령을 사용하는 것 같습니다. 결과 연산은 여전히 ​​로그 복잡성을 갖습니다.

예를 들어 second2의 위치에 관심이 있다고 가정합니다. 스크립트에서 먼저 ZSCORE으로 점수를 얻은 다음 2를 얻습니다. ZRANGEBYSCORE을 사용하여 해당 점수의 첫 번째 항목을 가져오고 second3을 얻습니다. 우리가 후있어 위치는 다음 second3ZREVRANK에 1을 더한

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 
+0

같은 @emostar 감사 할 수 있습니다! :) 어쩌면 내가 대답을 받아 들여야하지만 내 자신의 대답을 받아들이 기 전에 좀 더 upvotes 기다릴거야 ... – idrarig

+0

그것은 내가 찾을 수있는 가장 쉬운 방법이었다 ...하지만 다음 Q와 A는 똑같은 시간을 가지고, 그래서 당신은 방금 대답을 쓰는 것처럼 보입니다.) – staackuser2

+0

@emostar 오, 예!, 확실히!, 이제 기억합니다. 나는 "지식 Q & A 스타일 공유"를 시도했습니다. 나는 완전히 잊었다! – idrarig