2016-10-16 4 views
2

Redis Data typesは、sorted setと、キー値保存のための他の必要なデータ構造とを含む。でも、JavaのTreeMapやC++のstd::mapのようなソートされたマップがないのはなぜかと思います。私は基本的なデータ構造は、両方ともバランスの取れたバイナリ検索ツリーであると考えられるので、ソートされたセットとほとんど同じであると思います。Redisに注文されたハッシュマップがないのはなぜですか?

キーに応じてキーと値のペアを特定の順序で保存する必要があるケースがいくつかあります。しかし、現在のソートされたセットは、スコアに従ってキーを格納する目的のみに役立ちます。

答えて

3

はRedisのキーがバイナリ文字列があるキー

に応じて特定の順序で、我々は、キーと値のペアを格納する必要があり、いくつかのユースケースなければならないので、私は特定の順序は、あなたが言及したと仮定し、 (つまり、キーはmemcmp関数と比較されます)。その場合、C++のstd::mapSORTED SETと簡単に実装できます。あなたは、2つの段階でこれを達成することができます:SORTED SETでの2つの要素が同じスコアを持っている場合

ビルドのstdは:: Redisのソートセット

で設定し、それらを辞書順に並べられています。だから同じスコアで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 

のRedis 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 + 

とセットで各キーの地図

すでにstd::setが得られているので、キーを値とマップするとstd::mapが得られます。

set a value_a 
set b value_b 
set c value_c 

は持って一緒に

あなたはLuaのスクリプトに作品全体を包むことができ、これらの2つの手順を組み合わせるビルトインstd::map。これを次のように使用してください:

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

ありがとうございます。私は 'zadd a value_a'と考えています。ここでは' a'がキーで、 'value_a'は値です。しかし、実際には 'a'はソートされた集合の名前であり、' value_a'はその要素です。 'std :: map'のような場合、構文は' zadd std :: map key value'となります。 –

+0

Redisにはそのようなデータ構造はないので、私が答えで述べたように、2つのステップを実装する必要があります。これらのステップをluaスクリプトでラップすると、*組み込み* 'std :: map':' redis-cli --eval map.lua std :: map、key value'を得ることができます。 –

関連する問題