2017-10-11 4 views
1

Redis sorted setで辞書編集の範囲検索を実行しようとしていますが、この機能の仕組みを理解していて、結果が一致しません。 ZRANGECOUNT,ZRANGEBYLEXおよびZREMRANGEBYLEXを使用した場合の結果は同様です。Redis Lexicographical Range Searchの結果が一貫していない

ワーキングクエリ

これは単にZRANGEを使用して3つの要素を持つ私のセットの一例です。

redis> ZRANGE myset 0 -1 
0 00000000022xm26hax001 
1 00000000022xm26hax002 
2 00000000022xm26hax003 

また、すべての要素を辞書編集で取得することもできます。

redis> ZRANGEBYLEX myset - + 
0 00000000022xm26hax001 
1 00000000022xm26hax002 
2 00000000022xm26hax003 

期待通りにも働く最後の3つの文字をオフに残すことで範囲検索を行います。

redis> ZRANGEBYLEX myset [00000000022xm26hax [00000000022xm26hax\xff 
0 00000000022xm26hax001 
1 00000000022xm26hax002 
2 00000000022xm26hax003 

範囲の引数を調整する最初の2つの要素だけを選択することもできます。

redis> ZRANGEBYLEX myset [00000000022xm26hax001 [00000000022xm26hax002\xff 
0 00000000022xm26hax001 
1 00000000022xm26hax002 

短いスタートが許容可能であると思わ:

redis> ZRANGEBYLEX myset [00000000022x [00000000022xm26hax001\xff 
0 00000000022xm26hax001 

問題クエリ

私は短いバージョンを使用して選択しようとすると、しかし私は問題に実行文字列 - これらはすべて返されると期待したときにの結果を返します。

しかし、 "m"だけを元に戻すと、3つの要素すべてが再び返されます。

redis> ZRANGEBYLEX myset [00000000022xm [00000000022xm\xff 
0 00000000022xm26hax001 
1 00000000022xm26hax002 
2 00000000022xm26hax003 

誰かがこの動作を説明できますか?私の例のデータセットを与えられた"00000000022x"で始まるすべての要素を返す正しい方法は何ですか?

なぜZRANGEBYLEX myset [00000000022x [00000000022x\xffは結果を返しませんが、ZRANGEBYLEX myset [00000000022xm [00000000022xm\xffはすべての結果を返します。「m」を追加するだけで、期待どおりに動作するように見えますか?

答えて

0

これに対する解決策は、私が投稿した質問によって最終的には決定できない可能性があります。わかりやすくするために、私は期限切れのタイムスタンプであることを意図した各ソートされたセットエントリのスコアを除外しました。残念ながらZRANGEBYLEXのドキュメントは言う:

ソートセット内のすべての要素を辞書式順序を強制するために、同じスコアで挿入されている

、このコマンドが返す値を持つキーでソートされたセット内のすべての要素最小から最大の間

私のエントリは同じスコアを持たなかったので、辞書的にソートされていませんでした。

1

例では\xffのように、Redisで文字列のエスケープコードを解決したい場合は、文字列を引用符で囲む必要があります。

127.0.0.1:6379> ZRANGEBYLEX myset [00000000022xm26hax001 [00000000022xm26ha\xff 
(empty list or set) 

これはあなたの説明:この一方

127.0.0.1:6379> ZRANGEBYLEX myset [00000000022xm26hax001 "[00000000022xm26ha\xff" 
1) "00000000022xm26hax001" 
2) "00000000022xm26hax002" 
3) "00000000022xm26hax003" 

\xff 4としてバイト(92、120、102、102)を扱います。つまり

、これはバイト255として\xffを扱います混乱した結果。

関連する問題