KEYS
, SCAN
, FLUSHDB
這些在哪里痛倚?
這里是一些非常常見(jiàn)的常見(jiàn)問(wèn)題:
似乎沒(méi)有一個(gè)
Keys(...)
或者Scan(...)
方法? 如何查詢數(shù)據(jù)庫(kù)中存在哪些鍵?
或者
似乎沒(méi)有一個(gè)
Flush(...)
方法滥酥?如何刪除數(shù)據(jù)庫(kù)中的所有的鍵剩岳?
很奇怪的是,這里的最后一個(gè)關(guān)鍵詞是數(shù)據(jù)庫(kù)仇矾。
因?yàn)镾tackExchange.Redis的目標(biāo)是針對(duì)集群等場(chǎng)景庸蔼,知道哪些命令針對(duì) 數(shù)據(jù)庫(kù) (可以是分布在多個(gè)節(jié)點(diǎn)上的邏輯數(shù)據(jù)庫(kù))以及哪些命令針對(duì) 服務(wù)器 是很重要的。
以下命令都針對(duì)單個(gè)服務(wù)器:
-
KEYS
/SCAN
-
FLUSHDB
/FLUSHALL
RANDOMKEY
CLIENT
CLUSTER
-
CONFIG
/INFO
/TIME
SLAVEOF
-
SAVE
/BGSAVE
/LASTSAVE
-
SCRIPT
(不要混淆EVAL
/EVALSHA
) SHUTDOWN
SLOWLOG
-
PUBSUB
(不要混淆PUBLISH
/SUBSCRIBE
/ 等) - 一些
DEBUG
操作
(我可能錯(cuò)過(guò)了至少一個(gè))大多數(shù)這些將顯得很明顯贮匕,但前3行不那么明顯:
-
KEYS
/SCAN
只列出當(dāng)前服務(wù)器上的鍵; 而不是更廣泛的邏輯數(shù)據(jù)庫(kù) -
FLUSHDB
/FLUSHALL
只刪除當(dāng)前服務(wù)器上的密鑰;而不是更廣泛的邏輯數(shù)據(jù)庫(kù) -
RANDOMKEY
僅選擇當(dāng)前服務(wù)器上的密鑰; 而不是更廣泛的邏輯數(shù)據(jù)庫(kù)
實(shí)際上姐仅,StackExchange.Redis 通過(guò)簡(jiǎn)單地隨機(jī)選擇目標(biāo)服務(wù)器來(lái)欺騙 IDatabase
API上的 RANDOMKEY
,但這對(duì)其他服務(wù)器是不可能的刻盐。
那么如何使用它們呢掏膏?
最簡(jiǎn)單的:從服務(wù)器開(kāi)始,而不是數(shù)據(jù)庫(kù)敦锌。
// 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()
調(diào)用中已經(jīng)選擇了的目標(biāo)數(shù)據(jù)庫(kù))不同,這些方法對(duì)數(shù)據(jù)庫(kù)使用可選參數(shù)乙墙,或者默認(rèn)為0
颖变。
Keys(...)
方法值得特別一提:它并不常見(jiàn),因?yàn)樗鼪](méi)有一個(gè) *Async
對(duì)應(yīng)伶丐。 這樣做的原因是悼做,在后臺(tái),系統(tǒng)將確定使用最合適的方法(基于服務(wù)器版本的 KEYS
VS SCAN
)哗魂,如果可能的話肛走,將使用 SCAN
方法 一個(gè) IEnumerable<RedisKey>
在內(nèi)部執(zhí)行所有的分頁(yè) - 所以你永遠(yuǎn)不需要看到游標(biāo)操作的實(shí)現(xiàn)細(xì)節(jié)。
如果 SCAN
不可用录别,它將使用 KEYS
朽色,這可能導(dǎo)致服務(wù)器上的阻塞邻吞。 無(wú)論哪種方式,SCAN
和 KEYS
都需要掃描整個(gè)鍵空間葫男,所以在生產(chǎn)服務(wù)器上應(yīng)該避免 - 或者至少是針對(duì)從節(jié)點(diǎn)服務(wù)器抱冷。
所以我需要記住我連接到哪個(gè)服務(wù)器? 這真糟糕梢褐!
不旺遮,不完全是。 你可以使用 conn.GetEndPoints()
來(lái)列出節(jié)點(diǎn)(所有已知的節(jié)點(diǎn)盈咳,或者在原始配置中指定的節(jié)點(diǎn)耿眉,這些不一定是相同的東西),并且使用 GetServer()
迭代找到想要的服務(wù)器(例如鱼响,選擇一個(gè)從節(jié)點(diǎn))鸣剪。
查看原文
More
作者水平有限,若有疏漏或錯(cuò)誤還望提醒丈积,十分感謝筐骇。
您可以在這里 提出問(wèn)題 。