2014-09-15 2 views
2

각 Foo가 정확하게 하나의 Bar에 매핑되고 각 Bar가 정확히 하나의 Foo에 매핑되는 컬렉션이 있습니다. 해당 Foo를 Bar로 지정하고 Foo가있는 해당 Bar를 검색 할 수 있어야합니다. 이 작업을 수행하기 위해Redis에서 양방향 해시 맵을 만드는 방법은 무엇입니까?

, 순간, 나는 두 HashMaps을을 만들었습니다, 내가 삽입을 할 때마다, 나는 2 HSET의 각 해시 맵에 하나를 수행합니다 :이 후

HSET fooToBar foo1 bar1 
HSET barToFoo bar1 foo1 

, 조회를 어떤 방향으로도 매우 쉽습니다.

//Look up bar given a foo 
HGET fooToBar foo1 
//Look up foo given a bar 
HGET barToFoo bar1 

그러나이 솔루션은 완전히 만족스럽지 않습니다. 내가 이것을 사용하고있는 어플리케이션에서, 공간 제약이 속도 제약보다 더 중요 할 것입니다. 그리고 이것은 더 비싼 룩업 (이유 내에서)을 의미한다고해도 두 개가 아닌 하나의 데이터 구조를 갖는 것을 선호 할 것입니다.

Redis에서 양방향 해시 맵을 구현하는 더 좋은 방법이 있습니까?

+0

개체의 크기는 얼마나됩니까? –

+0

@AnthonyPalmer 각 하나는 그다지 크지 않지만, 그들 중 많은 수가 (수백만) 있습니다. Foos는 40-150 자 정도의 문자열입니다. 막대는 실제로 6-8 자리의 정수이지만 정수와 문자열 사이에서 변환되어 Redis 해시 맵에 사용됩니다. – bguiz

답변

5

데이터를 해시 대신 정렬 된 집합에 저장할 수 있습니다. 따라서 foos는 문자열이며 값은 막대 일 것이며 막대는 정수이므로 점수가됩니다.

새 foo 추가.

ZADD myzset bar foo 

foo를 사용하여 바를 가져 오는 중.

ZSCORE myzset foo 

O foo를 사용하여 줄

ZRANGEBYSCORE myzset bar bar 

이 마음 hgets에 보관되어 얻기 (1). zscore는 O (1)이지만 zrangebyscore는 O (log (N) + M)입니다. 여기서 N은 정렬 된 집합의 구성원 수이고 M은 반환되는 요소의 수입니다. 이것이 당신에게 공간을 절약 할 수 있을지 모르지만 나는 생각할만한 가치가있다.

관련 문제