2016-02-03 66 views
0

我使用Redis 3.0.6Redis通配符搜索和返回哈希值(%字)

我試圖使用Redis創建自動完成功能。我把三樣東西放在哈希,樂隊名稱,等級和創建年份中。

我想做一個通配符搜索,以獲得以特定字母及其附加功能開頭的樂隊名稱,如他們的排名和年份。

我該怎麼做?是否可以立即做,或者我需要一個子查詢來獲得他們的屬性?

HMSET 3doorsdown rank 7 year 2003 
OK 
127.0.0.1:6379> HMSET adele rank 1 year 2005 
OK 
127.0.0.1:6379> HMSET almora rank 3 year 1995 
OK 
127.0.0.1:6379> HMSET amiina rank 2 year 2009 
OK 
127.0.0.1:6379> HMSET anathema rank 4 year 1990 
OK 
127.0.0.1:6379> HMSET birdy rank 6 year 2012 
OK 
127.0.0.1:6379> HMSET blink182 rank 5 year 1999 
OK 

SCAN 0 match a* COUNT 1000返回以a開頭的所有記錄,而不是他們的隊伍和多年。

1) "0" 
2) 1) "adele" 
    2) "almora" 
    3) "anathema" 
    4) "amiina" 
127.0.0.1:6379> 

https://stackoverflow.com/a/33625191/3210431

我沒有使用的密鑰,因爲它的價格昂貴,但它也已經表示,SCAN是昂貴的(上圖),太。

我該怎麼辦?我是否需要在SET中保留名字,通過掃描進行匹配,如果有匹配,我應該按照他們的名字單獨在HASHES中查找這些記錄,如下所示?

1)尋找與一個在SET

2-)4條返回

3-)通過HGETALL獲取其特徵HASHES


編輯開始樂隊的名字:我有另一個想法。我將名字保存在SET中,使用ZRANGEBYLEX並在HASH中進行另一個查詢以獲取屬性,但我不知道哪一個是正確的方法。

+0

編輯中的方法是自2.8中引入詞典範圍以來的方法。 –

+0

@ItamarHaber非常感謝你! – salep

回答

1

Antirez寫了一本article about autocomplete你可能會發現有用的,可以從一些想法,但在本質:

使用掃描將是昂貴的,看看你遍歷你的整個按鍵,所以有序集合將是更好的方式去。你可以利用詞典的排序來完成大部分繁重的工作。缺點是你在爲速度而交易內存。一旦你有了匹配的鍵,你可以做一個HGETALL來獲取匹配的記錄。如果你擔心往返時間,你可以將這一切結合成一個單一的lua腳本(我會推薦這個)。

+0

我今天早上實際上發現了這篇文章,但自2010年編寫以來沒有閱讀。這就是我所需要的。總之,我仍然需要保留一個散列「數據庫」和一個「排序集」數據庫,對吧?如果發生匹配,我將使用確切名稱查詢散列數據庫,而不使用通配符(因爲我將從有序集合返回)來顯示記錄。順便謝謝。這真的很有幫助。 – salep

+1

這正是你要做的 - 你的哈希查找現在變成了O(1)操作。很高興幫助 – tddmonkey