2017-09-28 32 views
0

在Redis中,使用SCAN/COUNT命令組合,我們可以按照隨機順序從密鑰空間檢索密鑰。例如,如果密鑰空間有100個密鑰並且密鑰存儲爲001,002,003 ... 100。如果我們使用命令'scan 0 count 50',結果將包含以隨機順序列出的50個密鑰(例如002,003,050 ...)。如何在順序鍵中順序掃描Redis Keyspace存儲?

是否有反正我們可以掃描密鑰空間並按照存儲在Redis中的順序獲取密鑰?預期的鍵盤掃描結果應該像001,002,003,... 050 ...

此外,有沒有辦法指向Redis鍵空間中的特定鍵並掃描下一個'n'鍵?例如,轉到密鑰 - 010並從11掃描到30.

請指教。

+0

密鑰存儲在一個哈希表中,所以要求「按照存儲在redis中的順序」獲取它們會給你一個任意的順序。此外,由於掃描語義和哈希表分區,當您執行COUNT 50時,您可能會得到多於或少於50個的數據。只要清除您的問題中的一些明顯的誤解即可。接受的答案是好的。 – nnog

回答

2

這兩個問題的簡短答案是:

可以通過手動進行密鑰空間迭代,方法是隻對索引的索引進行索引,然後使用ZRANGE和ZRANGEBYLEX以有序的方式掃描鍵空間並分別從前綴開始掃描。

假設你創建鍵foo,bar和baz,你還需要索引它們。我們在交易執行此,以確保該指數是一致的,我們已經添加了所有鍵的有序集合,得分0。這

> MULTI 
> SET foo 1 
> ZADD __index__ 0 foo 
> EXEC 
> 
> MULTI 
> SET bar 2 
> ZADD __index__ 0 bar 
> EXEC 
> 
> MULTI 
> SET baz whatever 
> ZADD __index__ 0 baz 
> EXEC 
... and so on 

通知的意思是,我們可以利用詞彙範圍的優勢。

要迭代索引現在我們只需執行ZRANGE或ZREVRANGE。因爲所有元素的得分都是0,所以這個順序將是字典式的。所以分頁前10個元素:

ZRANGE __index__ 0 10 

要從特定條目「foo」的迭代10個鍵:

ZRANGEBYLEX __index__ [foo + LIMIT 0 10 

這需要在代碼中積極的東西,但不是很難做到。但無論如何,長期的答案 - 這是目前實現這一目標的唯一方法。有一些模塊可以讓你自動化一些,但它還沒有完全自動化。

+0

感謝您的解釋!我的問題陳述很好的解決方案 – BDENTHUS