2017-05-16 4 views
2

나는 리더 보드로 redis 정렬 된 세트를 사용하고 싶습니다. 사전 식 순서가Redis는 스코어 및 날짜 시간을 타이 브레이커로 정렬하여 정렬합니까?

을 사용 : 그러나 ZREVRANGE 0 x를 사용하여, 나는 단지 공식 레디 스 문서에서, 인 디폴트 타이 브레이커로, 점수 (소트 세트 스코어 기반 상승의 끝 부분)에서 상단 X를 얻을 수 있습니다 동등한 점수를 가진 요소들.

타이 브레이크는 필요한 점수 입력 날짜 시간입니다.

submits (in order)  redis sorts it as  I need 
User1 -- Score 50  User1     User1 
User3 -- Score 40  User2     User3 
User2 -- Score 40  User3     User2 

내가 볼 수있는 유일한 해결책은 항목의 마지막 업데이트 날짜 시간을 저장 여전히 상단 X 사용자의 최대 및 최소 점수를 얻을 수 ZREVRANGE key 0 x을 사용하는 것입니다. 그런 다음 ZREVRANGEBYSCORE key max min을 수행하십시오. 결과 길이가 x보다 큰 경우 적어도 하나의 동점이 있으므로 두 개의 키를 사용하여 Lua에서 그 작은 목록을 정렬합니다.

이 방법은 매우 느린 것으로 보이며 수십만 명의 사용자가 사용할 수 있어야합니다. 나는 두 개의 호출을 좋아하지 않고 루아 (루디 쪽에서 원자를 유지하기 위해)로 처리하고 정렬 된 세트에 2 개의 키를 사용하거나 다른 타이 브레이커를 구성하는 더 좋은 방법이 있는지 알고 싶습니까?

내 코드는 이미 작성되어 있으므로 데이터베이스 유형을 변경할 수 없습니다. 흥미로운 아이디어가 있다면, 나는 그들이 redis에 대한 전문가가 아니기 때문에, 그들에게 듣고 싶습니다.

답변

5

정렬 된 점수는 부동 소수점 값입니다. 스코어의 점수와 날짜 시간이 모두 맞을 수 있습니다.

  1. 점수 어떤 범위의 정수 것이다 0 10^2 Jan'2010은 (타임 스탬프의 크기를 줄일 수 있기 때문에, 유닉스 소인 초가 될 수있는 10 비트 만
  2. 점수 필요할 것이라고 단순하게 유닉스 타임 스탬프를 정수로 취할 수도 있습니다.)

이제 redis 점수를 RScore로 부릅니다. 사람의 점수를 숫자의 가장 왼쪽에있는 10 비트에 넣고 가장 오른쪽에있는 x 비트에 의 시간 소인을 넣을 수 있습니다. 중간의 비트는 0 일 수 있습니다.

그래서 Rscore를 정렬 할 때마다 점수별로 정렬되고 동점이 있으면 오른쪽 비트에있는 유닉스 타임 스탬프로 정렬됩니다. RScore에서 점수의 점수와 타임 스탬프를 찾으려면 올바른 비트 집합을 구문 분석하면됩니다. 파이썬에서이 작업을 수행하는 예제 유틸리티는 here입니다.

관련 문제