StackExchange.Redis 官方文檔(四) KeysScan
KEYS
, SCAN
, FLUSHDB
方法在哪?
經常有人問這些問題:
好像並沒有看到
Keys(...)
或者Scan(...)
方法?那我要怎麽查詢數據庫裏面存有哪些key?
或者
好像沒有
Flush(...)
方法?那我要怎麽清除數據庫裏面的所有key?
問題的關鍵就在這裏:數據庫。因為StackExchange.Redis旨在cluster等場景,知道哪些命令的目標是database(邏輯數據庫可以分布在多個節點上)和哪些命令的目標是server是很重要的。下面的命令的目標全部指向一個單獨server:
KEYS
/SCAN
FLUSHDB
/FLUSHALL
RANDOMKEY
CLIENT
CLUSTER
CONFIG
/INFO
/TIME
SLAVEOF
SAVE
/BGSAVE
/LASTSAVE
SCRIPT
(not to be confused withEVAL
/EVALSHA
)SHUTDOWN
SLOWLOG
PUBSUB
(not to be confused withPUBLISH
/SUBSCRIBE
/ etc)- some
DEBUG
operations
(我可能會漏掉不止一個。。。)他們當中大部分都可以很明顯的看出來,除了前面三個:
KEYS
/SCAN
只會列出當前server上的keys:而不是整個邏輯數據庫FLUSHDB
/FLUSHALL
同樣只會移除當前server上的所有的keysRANDOMKEY
同樣只會選出當前服務器上的一個key
事實上,StackExchange.Redis在 IDatabase
API 實現RANDOMKEY
的方式是隨機選擇一個目標服務器,對於其他的命令是不能這樣做的。
那我要怎麽使用這些命令呢?
很簡單:從server上使用這些命令,而不是database。
// get the target server var server = conn.GetServer(someServer); // show all keys in database 0 that include "foo" in their name foreach(var key in server.Keys(pattern: "*foo*")) { Console.WriteLine(key); } // completely wipe ALL keys from database 0 server.FlushDatabase();
要註意不像IDatabase
API(在調用 GetDatabase()
就已經選好了target database),這些方法對database都有一個可選的參數,或者默認為0
。
Keys(...)
方法需要特別註意的是:它的與眾不同之處在於它沒有對應的*Async
方法。原因是在scene下,系統會判斷出最適合采用的方法(KEYS
vs SCAN
,基於服務器版本),而且如果可以的話將會使用SCAN
在內部處理分頁的方式返回一個IEnumerable<RedisKey>
-所以並不需要知道當前操作的實現細節。如果SCAN
不可用,將會采用KEYS
,這將會造成服務器阻塞,無論哪一種方式,SCAN
and KEYS
需要遍歷整個key控件,所以在production server要避免使用這個方法-至少,在從服務器上使用。
那我就需要記住我連接是哪一臺服務器?that sucks。。。
不,並不需要。你可以使用conn.GetEndPoints()
列出節點(或者是所有已知的,或者在config當中指出來的-兩者不一定是相同的),然後使用GetServer()
叠代查處需要的server(例如:選擇一個slave)
StackExchange.Redis 官方文檔(四) KeysScan