前言
StackExchange.Redis 是 .NET 領域中最廣為人知的 Redis 套件,
因為知名度很高,所以相關的教學文章也非常豐富。
而今日卻意外發現其建立的連線數似乎跟預期的不太一樣,
趕緊趁著記憶猶新的時候記錄一番。
使用環境
.NET Core 3.1.16
StackExchange.Redis-2.2.4
預設連線數量
先來段簡短的範例程式:
var config = ConfigurationOptions.Parse("YOUR_REDIS_CONN_STRING");
var conn = ConnectionMultiplexer.Connect(config);
var db = conn.GetDatabase();
有使用過 StackExchange.Redis 的朋友都知道,
ConnectionMultiplexer
可以協助我們建立與 Redis 的連線。
猜猜看上面這段簡短的程式碼,會建立幾條與 Redis 的連線?
上面的程式碼會說話,只呼叫一次 Connect()
就代表建立 1 條連線吧?
這邊先賣個關子,
我們拿 LinqPad6 搭配 redis-cli ( 執行環境為 WSL2 ) 實測一下,
使用 CLIENT LIST 撈出 Redis Server 當下的連線清單後,
過濾名稱為 LAPTOP-BICQ1LBS
的連線(電腦本機名稱),
結果如下圖:
實測後意外發現建立的連線數居然是2條!
而從上圖右下方的cmd
欄位推斷,
很有可能是被 Pub/Sub 占用了其中一條。
Google 了一下便在 GitHub 及 Stackoverflow 上得到解答,
原因是 RESP v2 ( Redis 專屬的協定標準) 後,
禁止 Interactive Command 與 Pub/Sub 共用同一條連線,
而在官方的說明文件似乎沒看到有特別提這段。
關閉 Pub/Sub 用連線
但如果確定程式中並不會用到 Pub/Sub 模式的話,
我們也可以設定使其預設不建立 Pub/Sub 的連線。
var config = ConfigurationOptions.Parse("YOUR_REDIS_CONN_STRING");
// 在 CommandMap 中將 SUBSCRIBE 設定為 false
config.CommandMap = CommandMap.Create(new HashSet<string> { "SUBSCRIBE" }, false);
var conn = ConnectionMultiplexer.Connect(config);
var db = conn.GetDatabase();
再次進行測試,就可以看到連線只有一條了。
結語
本篇應該算是冷知識系列(還是說只有我不知道…),
內容如有勘誤,涵請告知指正~