2016-10-16 1 views
2

Redis Data typessorted set 및 키 - 값 저장을위한 기타 필요한 데이터 구조를 포함합니다. 하지만 Java의 TreeMap 또는 C++의 std::map과 같은 정렬 된 맵이없는 이유가 궁금합니다. 나는 기본 데이터 구조가 둘 다 균형 잡힌 이진 검색 트리로 가정 된 정렬 된 집합과 거의 유사하다고 생각합니다.Redis에서 주문 된 해시 맵이없는 이유는 무엇입니까?

키에 따라 특정 순서로 키 - 값 쌍을 저장해야하는 몇 가지 유스 케이스가 있어야합니다. 그러나 현재 정렬 된 집합은 점수에 따라 키를 저장하는 용도로만 사용됩니다.

답변

3

우리가

레디 스 키 이진 문자열이기 때문에

키에 따라 특정 순서로 키 - 값 쌍을 저장해야 할 몇 가지 사용 사례가 있어야합니다, 나는 특정 순서는 당신이 언급 한 가정 (즉, 키는 memcmp 함수와 비교됩니다). 이 경우 C++의 std::mapSORTED SET으로 쉽게 구현할 수 있습니다. 당신은 2 단계로 이것을 달성 할 수하십시오 SORTED SET 2 개 요소가 같은 점수가있는 경우

빌드 성병은 : 레디 스 '소트 세트

설정, 그들은 사전 편찬 순서로 정렬하고 있습니다. 그래서 그냥 같은 점수로 SORTED SET의 모든 구성원을 제공하는 std::set를 구축하기 위해 :

zadd std::set 0 c 
zadd std::set 0 a 
zadd std::set 0 b 

// since all these members have the same score, 
// the result is lexicographical ordered: 
// a b c 
zrange std::set 0 -1 

// the following command will fail, since 'c' already exists. 
zadd std::set 0 c 

레디 스 2.8, 당신은 std::set::lower_bound에 비슷한을 구축 할 수 있도록 사전 편찬 범위에서 작동하는 it supports some commands, 또는 이후 std::set::upper_bound

// something similar to lower_bound: find all members not less than b 
zrangebylex std::set [b + 
// something similar to upper_bound: find all members greater than b 
zrangebylex std::set (b + 

,536과 세트의 각 키를지도

이미 std::set을 얻었으므로 키를 값과 매핑하면 std::map을 얻을 수 있습니다.

set a value_a 
set b value_b 
set c value_c 

는이 함께

당신은 루아 스크립트로 전체 작업을 마무리 할 수 ​​이러한 두 단계를 결합 내장std::map. 다음과 같이 사용하십시오.

redis-cli --eval map.lua map_name , key value 
+0

감사합니다. 나는'zadd a value_a'라고 생각합니다. 여기서'a'는 열쇠이고'value_a'는 redis 관점의 값입니다. 그러나 실제로'a'는 정렬 된 집합의 이름이고'value_a'는 그 요소입니다. 'std :: map'과 같으면 구문은'zadd std :: map key value'가됩니다. –

+0

Redis에는 그러한 데이터 구조가 없으므로, 답안에서 언급 한 것처럼 2 단계를 구현해야합니다. 루아 스크립트에서이 단계들을 감쌀 경우 * 내장 된'std :: map' :'redis-cli --eval map.lua std :: map, key value'를 얻을 수 있습니다. –

관련 문제