StackExchange.Redis 官方文档(二) Configuration
配置
有多種方式可以配置redis,StackExchange.Redis提供了一個(gè)豐富的配置模型,在執(zhí)行Connect (or ConnectAsync) 時(shí)被調(diào)用:
var conn = ConnectionMultiplexer.Connect(configuration);這里的 configuration 可以是一下類型當(dāng)中的任意一項(xiàng):
- 一個(gè)ConfigurationOptions 實(shí)例
- 一個(gè)包含配置數(shù)據(jù)的字符串
后者基本上是前者的字符串形式
基本的配置字符串
最簡(jiǎn)單 的例子就是只包含主機(jī)的名稱:
var conn = ConnectionMultiplexer.Connect("localhost");這樣就會(huì)鏈接到部署在本地機(jī)器上使用默認(rèn)端口(6379)的單服務(wù)器。其余的配置選項(xiàng)只需要拼接在后面(要用逗號(hào)分隔).端口之前通常使用分號(hào)(:)分隔。配置 選項(xiàng) 在名稱后邊有一個(gè)=。示例:
var conn = ConnectionMultiplexer.Connect("redis0:6380,redis1:6380,allowAdmin=true");string和ConfigurationOptions之間的映射在下面有詳細(xì)的概述,你可以通過如下的方式對(duì)兩者進(jìn)行互相轉(zhuǎn)換:
ConfigurationOptions options = ConfigurationOptions.Parse(configString);or:
string configString = options.ToString();常用的方式將基本的配置保存在字符串當(dāng)中,但運(yùn)行的時(shí)候應(yīng)用特殊的配置:
string configString = GetRedisConfiguration(); var options = ConfigurationOptions.Parse(configString); options.ClientName = GetAppName(); // 只能在運(yùn)行狀態(tài)下才能獲取到 options.AllowAdmin = true; conn = ConnectionMultiplexer.Connect(options);帶有密碼的 Microsoft Azure Redis 實(shí)例:
var conn = ConnectionMultiplexer.Connect("contoso5.redis.cache.windows.net,ssl=true,password=...");配置選項(xiàng)
ConfigurationOptions對(duì)象有很多屬性,轉(zhuǎn)換時(shí)會(huì)自動(dòng)判斷。下面是一些常用的配置:
| abortConnect={bool} | AbortOnConnectFail | 如果是true,Connect方法在鏈接不到有效的服務(wù)器的時(shí)候不會(huì)創(chuàng)建一個(gè)鏈接實(shí)例 |
| allowAdmin={bool} | AllowAdmin | 啟用被認(rèn)定為是有風(fēng)險(xiǎn)的一些命令 |
| channelPrefix={string} | ChannelPrefix | 所有的發(fā)布訂閱頻道的前綴 |
| connectRetry={int} | ConnectRetry | 在初始化 Connect 失敗的時(shí)候重新嘗試進(jìn)行鏈接的次數(shù) |
| connectTimeout={int} | ConnectTimeout | 鏈接超時(shí)時(shí)間(ms) |
| configChannel={string} | ConfigurationChannel | 用于傳遞配置改變信息的廣播頻道 |
| defaultDatabase={int} | DefaultDatabase | 默認(rèn)的數(shù)據(jù)庫(kù)序數(shù),從1到-1 |
| keepAlive={int} | KeepAlive | 發(fā)送信息以保持sockets在線的間隔時(shí)間 |
| name={string} | ClientName | 在redis內(nèi)用于判別不同鏈接客戶端 |
| password={string} | Password | 密碼 |
| proxy={proxy type} | Proxy | 代理類型(如果有的話); 如 "twemproxy" |
| resolveDns={bool} | ResolveDns | 指定DNS解析服務(wù)器, 推薦明確指出,而不是采用默認(rèn)的 |
| serviceName={string} | ServiceName | 當(dāng)前沒有實(shí)現(xiàn)(用于sentinel模式) |
| ssl={bool} | Ssl | 使用SSL加密 |
| sslHost={string} | SslHost | 在服務(wù)器證書上注冊(cè)SSL主機(jī)身份標(biāo)識(shí) |
| syncTimeout={int} | SyncTimeout | 同步操作的超時(shí)時(shí)間(ms) |
| tiebreaker={string} | TieBreaker | 多主機(jī)服務(wù)器部署情形下中用于選擇出master服務(wù)的Key |
| version={string} | DefaultVersion | Redis版本(用于從服務(wù)器獲取不到此信息時(shí)) |
| writeBuffer={int} | WriteBuffer | 輸出緩存大小 |
配置字符串的Token是用逗號(hào)分隔開的;任何沒有 = 符號(hào)的Token都會(huì)被認(rèn)為是一個(gè)服務(wù)器節(jié)點(diǎn)。節(jié)點(diǎn)信息如果沒有指出端口號(hào)在沒有使用ssl的情況下會(huì)默認(rèn)為6379,啟用了ssl則默認(rèn)使用6380。
Token當(dāng)中如果是以$開頭則表示是命令映射信息,例如:$config=cfg。
自動(dòng)配置和手動(dòng)配置
在通常的方案當(dāng)中,StackExchange.Redis 會(huì)自動(dòng)配置很多設(shè)置,包括服務(wù)器類型和版本,鏈接超時(shí)時(shí)間,以及主從關(guān)系。但是,有時(shí)候這些命令會(huì)被redis服務(wù)器無效化,這種情況下,提供這些信息是很有必要的:
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里有一個(gè)不常用的功能,就是禁用或者重命名個(gè)別的命令。在這之前的每一個(gè)例子,這個(gè)功能是通過CommandMap操作的,但是它并沒有采用傳參數(shù)HashSet<string>或者 Create()的形式(去明確指出哪些命令可用哪些命令不可用),而是采用 Dictionary<string,string>的形式。這個(gè)字典當(dāng)中包含的所有的命令都被假定為啟用,而且并沒有被重命名。 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=useTwemproxy
Twemproxy是一個(gè)可以把多個(gè)服務(wù)器當(dāng)成一個(gè)服務(wù)器的工具,帶有分享和容錯(cuò)能力(這和redis cluster很相似,但是實(shí)現(xiàn)方式不同)。Twemproxy可以使用的功能是簡(jiǎn)化過的。為了避免手動(dòng)配置,可以使用Proxy配置項(xiàng):
var options = new ConfigurationOptions {EndPoints = { "my-server" },Proxy = Proxy.Twemproxy };Tiebreakers和配置更改公告
正常情況下StackExchange.Redis會(huì)自動(dòng)判別主從節(jié)點(diǎn)。但是,如果你沒有使用類似于redis-sentinel或者redis cluster的管理工具,你可能會(huì)碰到有多個(gè)master節(jié)點(diǎn)的情況(例如,維護(hù)時(shí)重置了節(jié)點(diǎn),在網(wǎng)絡(luò)中在就表現(xiàn)為是一個(gè)master)。為了解決這種情況,StackExchange.Redis使用了tie-breaker的概念 - 他只有在檢測(cè)到多個(gè)master的時(shí)候才會(huì)用到。(不包括redis cluster的情況下,因?yàn)閞edis cluster是正是需要多個(gè)master的)。為了兼容BookSleeve,默認(rèn)的key是"__Booksleeve_TieBreak"(只存在于0號(hào)數(shù)據(jù)庫(kù))。他是一種原始的投票機(jī)制去判斷更適用的master。(so that work is routed correctly.)
類似的,當(dāng)配置發(fā)生改變時(shí)(特別是master/slave配置),讓已經(jīng)鏈接的實(shí)例知道新的環(huán)境(通過INFO, CONFIG等可以使用的命令)是很重要的。StackExchagnge.Redist通過自動(dòng)訂閱一個(gè)pub/sub頻道,這個(gè)頻道是用來發(fā)送這些通知的。為了兼容BookSleeve,頻道名名稱默認(rèn)是 "__Booksleeve_MasterChanged"。
這兩個(gè)選項(xiàng)都是可以通過.ConfigurationChannel和.TieBreaker配置屬性自定義或者禁用的(設(shè)置為"")。
這些設(shè)置也可以被IServer.MakeMaster()方法使用,來設(shè)置數(shù)據(jù)庫(kù)里的tie-breaker以及廣播配置更改消息。對(duì)于master/slave變化的配置信息也可以通過 ConnectionMultiplexer.PublishReconfigure 方法來請(qǐng)求所有節(jié)點(diǎn)刷新配置。
原文地址:StackExchange.Redis
大部分為意譯,如有不當(dāng)還請(qǐng)指正
轉(zhuǎn)載于:https://www.cnblogs.com/ArvinZhao/p/6007043.html
總結(jié)
以上是生活随笔為你收集整理的StackExchange.Redis 官方文档(二) Configuration的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [课程设计]Scrum 多鱼点餐系统(
- 下一篇: linux cmake编译源码,linu