配置
配置Redis有很多不同的方式,StackExchange.Redis提供了一個豐富的配置模型,我們可在調用 Connect 或者 ConnectAsync 方法時傳入配置:
var conn = ConnectionMultiplexer.Connect(configuration);
在這裡參數configure可以是: ConfigurationOptions 執行個體配置 字串方式配置
後面一種也是前面一種的標記形式。 基本配置 - 通過字串配置
最簡單的配置執行個體就是以主機名稱來配置:
var conn = ConnectionMultiplexer.Connect("localhost");
這會串連到本機上的單個伺服器,預設使用Redis的預設連接埠:6379。還有一些選項以逗號分隔的方式附加上去。連接埠通常用一個冒號(:)來表示。配置選項的名字後跟隨了一個=號。如下所示:
var conn = ConnectionMultiplexer.Connect("redis0:6380,redis1:6380,allowAdmin=true");
我們可以自由的在 string 和 ConfigurationOptions 兩者之間相互轉換,如下所示:
ConfigurationOptions options = ConfigurationOptions.Parse(configString);
或者
string configString = options.ToString();
最常用的方式是將基本資料儲存在一個字串中,然後在運行時應用這個特定的基本資料:
string configString = GetRedisConfiguration();var options = ConfigurationOptions.Parse(configString);options.ClientName = GetAppName(); // 僅僅在運行時才知道options.AllowAdmin = true;conn = ConnectionMultiplexer.Connect(options);
在微軟Azure上使用Redis並附上密碼的例子:
var conn = ConnectionMultiplexer.Connect("contoso5.redis.cache.windows.net,ssl=true,password=...");
配置選項
ConfigurationOptions 對象具有很多屬性,所有選項的說明都已在智能提示裡面。下面表格是一些最常用的選項描述:
Configuration string |
ConfigurationOptions |
描述 |
abortConnect={bool} |
AbortOnConnectFail |
如果是 true,當沒有可用的伺服器時 Connect 不會建立串連 |
allowAdmin={bool} |
AllowAdmin |
如果是 true,開啟一些被認為是有風險的命令 |
channelPrefix={string} |
ChannelPrefix |
所有 pub/sub 操作的可選通道首碼 |
connectRetry={int} |
ConnectRetry |
在初始化 Connect 時,串連重試次數 |
connectTimeout={int} |
ConnectTimeout |
連線逾時設定,時間單位是ms |
configChannel={string} |
ConfigurationChannel |
設定廣播通道名稱 |
defaultDatabase={int} |
DefaultDatabase |
預設資料庫索引, 從 0 到 databases - 1 |
keepAlive={int} |
KeepAlive |
如果在指定時間(seconds)內沒有活動,那麼發送一條資訊來協助socket保持串連 |
name={string} |
ClientName |
唯一名稱,用來識別Redis裡面的串連 |
password={string} |
Password |
Redis伺服器密碼 |
proxy={proxy type} |
Proxy |
使用的代理類型 (如果有的話); 例如 “twemproxy” |
resolveDns={bool} |
ResolveDns |
指定DNS解析方式是顯示而不是隱式 |
serviceName={string} |
ServiceName |
當前沒有實現 |
ssl={bool} |
Ssl |
指定使用SSL加密 |
sslHost={string} |
SslHost |
強制SSL主機識別,需要使用伺服器端認證 |
syncTimeout={int} |
SyncTimeout |
非同步逾時設定(ms) |
tiebreaker={string} |
TieBreaker |
主要是在一個模糊不清的主機之間選擇出一個作為主伺服器 |
version={string} |
DefaultVersion |
Redis 版本層級 (該選項是非常有用的,當伺服器不可用時) |
writeBuffer={int} |
WriteBuffer |
輸出緩衝區的大小 |
在配置字串中的標記都是以逗號分隔的;任何沒有 = 符號的都被假定為Redis的服務終端。如果沒有開啟SSL,並且終端沒有指定一個明確的連接埠,那麼將使用6379作為連接埠;如果開啟了SSL,那麼6380將作為連接埠。以 ∗∗開始的標記會被當做命令來映射;例如:∗∗ ** 開始的標記會被當做命令來映射;例如:**config=cfg 。 自動設定與手動設定
在很多常見的情況下,StackExchange.Redis 將會自動的配置多個設定選項,包括伺服器類型和版本,連線逾時和主/從關係配置。可是有時候在Redis伺服器這個命令是被禁止的。在這種情況下,提供更多的資訊是非常有用的:
ConfigurationOptions config = new ConfigurationOptions{ EndPoints = { { "redis0", 6379 }, { "redis1", 6380 } }, CommandMap = CommandMap.Create(new HashSet<string> { // 排除幾個命令 "INFO", "CONFIG", "CLUSTER", "PING", "ECHO", "CLIENT" }, available: false), KeepAlive = 180, DefaultVersion = new Version(2, 8, 8), Password = "changeme"};
上面的配置等同於下面的字串配置:
redis0:6379,redis1:6380,keepAlive=180,version=2.8.8,$CLIENT=,$CLUSTER=,$CONFIG=,$ECHO=,$INFO=,$PING=
重新命名命令
在Redis中有些不常用的功能,那就是你能禁用或者重新命名單個命令。正如前面的所展示的,這是通過 CommandMap 來實現的,而不是通過 HashSet\
var commands = new Dictionary<string,string> { { "info", null }, // 禁用 { "select", "use" }, // 由於某種原因重新命名為等效的SQL};var options = new ConfigurationOptions { // ... CommandMap = CommandMap.Create(commands), // ...}
上面的配置等同於下面的字串配置(在連接字串中):
$INFO=,$SELECT=use
Twemproxy
Twemproxy是一個允許多個Redis執行個體使用起來像是單個服務一樣的工具,它內建分區和容錯能力(這很像Redis叢集,但是它是單獨實現的)。Twemproxy簡化了功能設定的可用性。為了避免手動設定,Proxy 選項可以這樣配置:
var options = new ConfigurationOptions{ EndPoints = { "my-server" }, Proxy = Proxy.Twemproxy};
打破僵局(Tiebreakers或者權衡決策)和配置更改公告
通常StackExchange.Redis會自動的解決主/從節點問題。然而可能你沒有使用像 Redis叢集 或 Redis-Sentinel 那樣的管理工具,你可能會碰到這樣的一個場合:同時具有多個主節點(例如:當我們以維護為目的而重新設定一個節點時,它可能作為一個主節點重新出現在網路上)。為瞭解決這個問題,StackExchange.Redis可以用打破僵局(權衡決策)這一概念,這個僅適用於多個主機被發現的情況。為了相容 BookSleeve,預設鍵名是 “__Booksleeve_TieBreak”(一直是在索引為0的資料庫中)。這用來作為一個簡單的投票機制,協助決策那個是首選主節點,使之以正確路由工作。
同樣的,當配置發生更改的時候(尤其是在主/從配置的時候),這對於串連執行個體來說將是非常重要的,這可以使它們自己意識到有新的情況發生(通過 IFNO,CONFIG 等等)。StackExchange.Redis通過自動訂閱來 pub/sub 發送這樣的通知。由於類似的原因,預設是鍵名是 “__Booksleeve_MasterChanged”。
這兩個選項可以被自訂或者禁用(設定為”“),可以通過 .ConfigurationChannel 和 .TieBreaker 來配置屬性。
這些設定也可以通過 IServer.MakeMaster() 來配置,可以在資料庫中設定打破僵局(tie-breaker)和廣播配置更改的訊息。通過 ConnectionMultiplexer.PublishReconfigure 方法,配置訊息也可以單獨使用主/從更新來請求所有的節點重新整理它們的配置。