2017-10-11 80 views
1

我想在Redis sorted set上進行詞典範圍搜索,但基於我對這個功能的工作原理的理解,獲得了不一致的結果。當使用ZRANGECOUNTZRANGEBYLEXZREMRANGEBYLEX時,結果相似。Redis詞典搜索範圍搜索不一致

工作查詢

這是我定的3個元素只是用ZRANGE的例子。

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 

調整範圍參數我也可以只選擇前兩個元素。

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

短的啓動似乎是可以接受的:

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

問題查詢

我遇到問題但是當我嘗試使用的一個較短的版本來選擇字符串 - 這些都返回結果,當我期望他們返回。

ZRANGEBYLEX myset [00000000022xm26h [00000000022xm26h\xff 
ZRANGEBYLEX myset [00000000022x [00000000022x\xff 

但是,只加回「m」使得它再次返回所有三個元素。

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

如果您希望Redis在您的字符串中解析轉義碼(例如您的示例中的\xff),則需要將字符串包裝在引號中。

換句話說,這將治療\xff作爲字節255:

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

鑑於此對待\xff作爲四字節(92,120,102,102):

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

這解釋了您的令人困惑的結果。