我想找出存儲在與redis中的模式匹配的鍵列表中的值。我試着用SCAN
因此以後我可以用MGET
讓所有的價值,問題是:Redis掃描計數:如何強制SCAN返回與模式匹配的所有鍵?
SCAN 0 MATCH "foo:bar:*" COUNT 1000
並不而
SCAN 0 MATCH "foo:bar:*" COUNT 10000
返回所需的鍵返回任何值。 我如何強制SCAN
查看所有現有的密鑰?我是否必須爲此查找lua?
我想找出存儲在與redis中的模式匹配的鍵列表中的值。我試着用SCAN
因此以後我可以用MGET
讓所有的價值,問題是:Redis掃描計數:如何強制SCAN返回與模式匹配的所有鍵?
SCAN 0 MATCH "foo:bar:*" COUNT 1000
並不而
SCAN 0 MATCH "foo:bar:*" COUNT 10000
返回所需的鍵返回任何值。 我如何強制SCAN
查看所有現有的密鑰?我是否必須爲此查找lua?
隨着代碼波紋管,你將光標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
我如何強制掃描查看所有現有的鍵,看看是否存在匹配一氣呵成? – DarthSpeedious
@DarthSpeedious我編輯我的帖子 – khanou
如果redis中有很多密鑰正確的話,這會太慢了嗎?我想我將不得不重新考慮我的方法?哪一個會更好地一次搜索關鍵字或創建一個遍歷遊標的循環? – DarthSpeedious
正要把這個在這裏的人感興趣的是如何使用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
。我很難弄清楚光標號是什麼,爲什麼我會隨機得到一個空的列表或重複的項目,但即使我知道我剛把項目放進去。
閱讀後:
它更有意義,但仍有一些深層次的編程魔術和妥協發生在迭代套。
強制SCAN一次性完成整個鍵空間相當於運行KEYS。請注意,SCAN是專門爲此目的而引入的 - 不運行KEYS。 –
@ItamarHaber做的掃描還會像KEYS命令一樣,爲整個迭代屏蔽鍵空間(一次迭代)嗎? – DarthSpeedious
是的 - 幾乎所有的操作都被阻止。 –