[ .NET Core ] - ConnectionMultiplexer 預設建立的連線數量

前言

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();

 

再次進行測試,就可以看到連線只有一條了。

 

結語

本篇應該算是冷知識系列(還是說只有我不知道…),

內容如有勘誤,涵請告知指正~

 

參考