2012-04-08 3 views
3

나는 Redis에서 큰 정렬 된 세트 (5m-25m)를 가지고 있으며 그 세트의 조합에 나타나는 첫 번째 요소를 얻고 싶습니다. 예를 들어 20 세트가 있으며 1, 5, 7 및 12 세트를 가져 와서 해당 세트의 첫 번째 교차 만 가져오고 싶습니다.Redis Sorted Sets : 첫 번째 교차 요소는 어떻게 가져 옵니까?

ZINTERSTORE 다음에 "ZRANGE foo 0 0"이 더 많은 작업을 수행하는 것처럼 보일 것입니다. 모두 첫 번째 교차점을 반환합니다. 모든 교차점을 계산할 필요가없는 대체 솔루션이 있습니까?

해시 회원이 요소 만들기 :이 좋을 것 있지만

답변

2

는 직접 네이티브 대안이 없다. 정렬 된 집합 중 하나에 각각 추가 할 때 관련 구성원을 증가시킵니다 (HINCRBY 사용). 물론 추가하려고하는 정렬 된 집합에 이미 요소가 존재하지 않는지 확인한 후에 만 ​​증가시킬 것입니다.

그런 식으로 어떤 요소가 4 세트에 나타나는지 신속하게 알 수 있습니다.

UPDATE : 지금 내가 그것에 대해 다시 생각하는 것이, 그것은 4 (O (n은))의 값으로 항목을 찾기 위해 해시를 쿼리 할 비용이 너무 많이 있습니다. 또 다른 옵션은 다른 정렬 된 집합을 만드는 것입니다. 구성원은 자신의 요소이고, 점수는 점차 증가합니다 (앞에서 설명한대로 ZINCRBY 사용). 점수가 4 인 모든 요소를 ​​신속하게 가져올 수 있습니다 (ZRANGEBYSCORE 사용).

+0

감사합니다. Ofer, 나는 정말로 내 질문에 자신을 아주 분명히 말하지 않았습니다. 4 세트는 집합의 집합에서 4 세트입니다 ... 그래서 나는 20 세트를 가질 수 있습니다. 그러나 주어진 쿼리 중에 2,3 또는 4 개를 가져 와서 첫 번째 교차를 얻지는 않을 것입니다. 나는 내 질문을 수정할 것이다. – jdoig

+0

글쎄, 그 경우에는 세트에 대한 Redis의 기본 제공 작업에 대한 해결 방법을 생각할 수 없습니다. 다른 사용자가 아이디어를 내놓을 지 봅시다. 나는 다음을 따르고있다 ... –

+1

나는 여러 조각의 결과를 줄이기 위해 Redis의 여러 인스턴스에서 매우 관리하기 쉬운 덩어리로 세트를 분할하기에 충분한 코어를 확보했다. 또한 교차로 전체 세트를 잠시 동안 유지하는 것이 캐싱과 비슷한 성능 이점을 제공한다는 사실을 알게되었습니다. – jdoig

관련 문제