1. 程式人生 > >StackExchange.Redis 官方文檔(四) KeysScan

StackExchange.Redis 官方文檔(四) KeysScan

有一個 time targe 默認 publish complete 內部 () 不可用

原文: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 with EVAL / EVALSHA)
  • SHUTDOWN
  • SLOWLOG
  • PUBSUB (not to be confused with PUBLISH / SUBSCRIBE / etc)
  • some DEBUG operations

(我可能會漏掉不止一個。。。)他們當中大部分都可以很明顯的看出來,除了前面三個:

  • KEYS / SCAN 只會列出當前server上的keys:而不是整個邏輯數據庫
  • FLUSHDB / FLUSHALL 同樣只會移除當前server上的所有的keys
  • RANDOMKEY 同樣只會選出當前服務器上的一個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