2015-10-16 39 views
12

我想找出存儲在與redis中的模式匹配的鍵列表中的值。我試着用SCAN因此以後我可以用MGET讓所有的價值,問題是:Redis掃描計數:如何強制SCAN返回與模式匹配的所有鍵?

SCAN 0 MATCH "foo:bar:*" COUNT 1000 

並不而

SCAN 0 MATCH "foo:bar:*" COUNT 10000 

返回所需的鍵返回任何值。 我如何強制SCAN查看所有現有的密鑰?我是否必須爲此查找lua?

+1

強制SCAN一次性完成整個鍵空間相當於運行KEYS。請注意,SCAN是專門爲此目的而引入的 - 不運行KEYS。 –

+0

@ItamarHaber做的掃描還會像KEYS命令一樣,爲整個迭代屏蔽鍵空間(一次迭代)嗎? – DarthSpeedious

+0

是的 - 幾乎所有的操作都被阻止。 –

回答

17

隨着代碼波紋管,你將光標0

SCAN 0 MATCH "foo:bar:*" COUNT 1000 

掃描1000第一對象的結果,你會得到一個新的光標回憶

SCAN YOUR_NEW_CURSOR MATCH "foo:bar:*" COUNT 1000 

要掃描1000下一個對象。然後,當您將COUNT從1000增加到1000並檢索數據時,您將掃描更多密鑰,然後在您的案例中匹配更多密鑰。

要掃描您需要召回SCAN直到光標整個名單發出響應返回零(即整個掃描)

使用INFO命令來獲取您的密鑰量像

DB0:鑰匙= YOUR_AMOUNT_OF_KEYS,到期= 0,avg_ttl = 0

然後調用

SCAN 0 MATCH "foo:bar:*" COUNT YOUR_AMOUNT_OF_KEYS 
+0

我如何強制掃描查看所有現有的鍵,看看是否存在匹配一氣呵成? – DarthSpeedious

+0

@DarthSpeedious我編輯我的帖子 – khanou

+0

如果redis中有很多密鑰正確的話,這會太慢了嗎?我想我將不得不重新考慮我的方法?哪一個會更好地一次搜索關鍵字或創建一個遍歷遊標的循環? – DarthSpeedious

7

正要把這個在這裏的人感興趣的是如何使用Python redis庫做到這一點:

import redis 
redis_server = redis.StrictRedis(host=settings.redis_ip, port=6379, db=0) 
mid_results = [] 
cur, results = redis_server.scan(0,'foo:bar:*',1000) 
mid_results += results 

while cur != 0: 
    cur, results = redis_server.scan(cur,'foo:bar:*',1000) 
    mid_results += results 

final_uniq_results = set(mid_results) 

我花了幾天的圖了這一點,但基本上每個scan會返回一個元組。

例子:

(cursor, results_list) 

(5433L, [... keys here ...]) 
(3244L, [... keys here, maybe ...]) 
(6543L, [... keys here, duplicates maybe too ...]) 
(0L, [... last items here ...]) 
  • 請掃描cursor直到它返回到0
  • 有保證它將返回到0
  • 即使掃描在掃描之間返回空的results_list

我很難弄清楚光標號是什麼,爲什麼我會隨機得到一個空的列表或重複的項目,但即使我知道我剛把項目放進去。

閱讀後:

它更有意義,但仍有一些深層次的編程魔術和妥協發生在迭代套。

相關問題