配置
因為有很多不同配置 redis 的方式,StackExchange.Redis 提供了一個豐富的配置模型子眶,當調(diào)用 Connect
(或 ConnectAsync
)時調(diào)用它瀑凝。
var conn = ConnectionMultiplexer.Connect(configuration);
這里的 configuration
可以是下面的任意一個:
- 一個
ConfigurationOptions
實例 - 一個代表配置的
string
后者是 基本上 是前者的標記化形式。
基本配置字符串
最簡單的 配置示例只需要一個主機名:
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();
常見的用法是將 基礎配置 細節(jié)存儲在一個字符串中,然后在運行時應用特定的詳細信息:
string configString = GetRedisConfiguration();
var options = ConfigurationOptions.Parse(configString);
options.ClientName = GetAppName(); // only known at runtime
options.AllowAdmin = true;
conn = ConnectionMultiplexer.Connect(options);
帶密碼的 Microsoft Azure Redis 示例
var conn = ConnectionMultiplexer.Connect("contoso5.redis.cache.windows.net,ssl=true,password=...");
配置選項
ConfigurationOptions
對象具有許多的屬性磁奖,所有這些都在智能提示中都有囊拜。
一些更常用的選項包括:
配置字符串 | ConfigurationOptions |
含義 |
---|---|---|
abortConnect={bool} | AbortOnConnectFail |
如果為true,Connect 沒有服務器可用時將不會創(chuàng)建連接 |
allowAdmin={bool} | AllowAdmin |
啟用被認為具有風險的一系列命令 |
channelPrefix={string} | ChannelPrefix |
所有發(fā)布/訂閱操作的可選頻道前綴 |
connectRetry={int} | ConnectRetry |
在初始 Connect 期間重復連接嘗試的次數(shù) |
connectTimeout={int} | ConnectTimeout |
連接操作的超時時間(ms) |
configChannel={string} | ConfigurationChannel |
用于傳達配置更改的廣播通道名稱 |
defaultDatabase={int} | DefaultDatabase |
默認數(shù)據(jù)庫索引, 從 0 到 databases - 1 (0 到 Databases.Count -1) |
keepAlive={int} | KeepAlive |
發(fā)送消息以幫助保持套接字活動的時間(秒) |
name={string} | ClientName |
標識 redis 中的連接 |
password={string} | Password |
redis 服務器的密碼 |
proxy={proxy type} | Proxy |
正在使用的代理類型(如果有); 例如“twemproxy” |
resolveDns={bool} | ResolveDns |
指定DNS解析應該是顯式和熱切比搭,而不是隱式 |
serviceName={string} | ServiceName |
目前尚未實施(預期與sentinel一起使用) |
ssl={bool} | Ssl |
指定應使用SSL加密 |
sslHost={string} | SslHost |
在服務器證書上強制執(zhí)行特定的SSL主機標識 |
syncTimeout={int} | SyncTimeout |
允許同步操作的時間(ms) |
tiebreaker={string} | TieBreaker |
用于在不明確的主場景中選擇服務器的鍵 |
version={string} | DefaultVersion |
Redis版本級別(當服務器要使用的版本默認不可用時使用) |
writeBuffer={int} | WriteBuffer |
輸出緩沖區(qū)的大小 |
ReconnectRetryPolicy={IReconnectRetryPolicy} | ReconnectRetryPolicy |
重新連接重試策略 |
配置字符串中的令牌是逗號分隔的;任何沒有=
符號的都假定為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>
{ // EXCLUDE a few commands
"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的一個很不尋常的功能是可以禁用或重命名或禁用并重命名單個命令锅劝。
根據(jù)前面的例子攒驰,這是通過CommandMap
來實現(xiàn)的,但不是傳遞一個HashSet <string>
到Create()
(表示可用或不可用的命令)故爵,而是傳遞一個Dictionary < string>
玻粪。
字典中未提及的所有命令都默認已啟用且未重命名。
“null”或空白值記錄命令被禁用诬垂。 例如:
var commands = new Dictionary<string,string> {
{ "info", null }, // disabled
{ "select", "use" }, // renamed to SQL equivalent for some reason
};
var options = new ConfigurationOptions {
// ...
CommandMap = CommandMap.Create(commands),
// ...
}
以上代碼等同于(在連接字符串中):
$INFO=,$SELECT=use
Twemproxy
Twemproxy 是允許使用多個 redis 實例就像它是一個單個服務器劲室,具有內(nèi)置分片和容錯(很像 redis 集群,但單獨實現(xiàn))的工具结窘。
Twemproxy可用的功能集減少很洋。
為了避免手動配置,可以使用 Proxy
選項:
var options = new ConfigurationOptions
{
EndPoints = { "my-server" },
Proxy = Proxy.Twemproxy
};
Tiebreakers 和配置更改公告
通常 StackExchange.Redis 都會自動解析 主/從節(jié)點隧枫。然而喉磁,如果你不使用諸如 redis-sentinel 或 redis 集群之類的管理工具,有時你會有多個主節(jié)點(例如官脓,在重置節(jié)點以進行維護時协怒,它可能會作為主節(jié)點重新顯示在網(wǎng)絡上)。
為了幫助解決這個問題卑笨,StackExchange.Redis 可以使用 tie-breaker 的概念 - 這僅在檢測到多個主節(jié)點時使用(不包括需要多個主節(jié)點的redis集群)孕暇。
為了與 BookSleeve 兼容,tiebreaker 使用默認的key為 "__Booksleeve_TieBreak"
(總是在數(shù)據(jù)庫0中)赤兴。
這用作粗略的投票機制妖滔,以幫助確定首選 主機,以便能夠按正確的路由工作桶良。
同樣座舍,當配置改變時(特別是主/從配置),連接的實例使得他們意識到新的情況(在可用的地方通過 INFO
艺普,CONFIG
等進行通知 )是很重要的簸州。
StackExchange.Redis 通過自動訂閱可以在其上發(fā)送這樣的通知的發(fā)布/訂閱通道來實現(xiàn)。
由于類似的原因歧譬,這默認為"__Booksleeve_MasterChanged"
岸浑。
這兩個選項都可以通過 .ConfigurationChannel
和 .TieBreaker
配置屬性來定制或禁用(設置為""
)。
These settings are also used by the IServer.MakeMaster()
method, which can set the tie-breaker in the database and broadcast the configuration change message.
The configuration message can also be used separately to master/slave changes simply to request all nodes to refresh their configurations, via the ConnectionMultiplexer.PublishReconfigure
method.
這些設置也由 IServer.MakeMaster()
方法使用瑰步,它可以設置數(shù)據(jù)庫中的 tie-breaker 并廣播配置更改消息矢洲。
配置消息也可以單獨用于主/從變化,只需通過調(diào)用 ConnectionMultiplexer.PublishReconfigure
方法請求所有節(jié)點刷新其配置缩焦。
重新連接重試策略
當連接由于任何原因丟失時读虏,StackExchange.Redis會自動嘗試在后臺重新連接。
它將繼續(xù)重試袁滥,直到連接恢復盖桥。 它將使用 ReconnectRetryPolicy 來決定在重試之間應該等待多長時間。
ReconnectRetryPolicy可以是線性的(默認)题翻,指數(shù)的或者是一個自定義的重試策略揩徊。
舉個例子:
config.ReconnectRetryPolicy = new ExponentialRetry(5000); // defaults maxDeltaBackoff to 10000 ms
//retry# retry to re-connect after time in milliseconds
//1 a random value between 5000 and 5500
//2 a random value between 5000 and 6050
//3 a random value between 5000 and 6655
//4 a random value between 5000 and 8053
//5 a random value between 5000 and 10000, since maxDeltaBackoff was 10000 ms
//6 a random value between 5000 and 10000
config.ReconnectRetryPolicy = new LinearRetry(5000);
//retry# retry to re-connect after time in milliseconds
//1 5000
//2 5000
//3 5000
//4 5000
//5 5000
//6 5000
查看原文
More
作者水平有限,若有疏漏或錯誤還望提醒嵌赠,十分感謝塑荒。
您可以在這里 提出問題 。