配置

配置Redis有很多不同的方式,StackExchange.Redis提供了一个丰富的配置模型,我们可在调用 Connect 或者 ConnectAsync 方法时传入配置:

  1. var conn = ConnectionMultiplexer.Connect(configuration);

在这里参数configure可以是:

  • ConfigurationOptions 实例配置
  • 字符串方式配置

后面一种也是前面一种的标记形式。

基本配置 - 通过字符串配置

最简单的配置实例就是以主机名来配置:

  1. var conn = ConnectionMultiplexer.Connect("localhost");

这会连接到本机上的单个服务器,默认使用Redis的缺省端口:6379。还有一些选项以逗号分隔的方式附加上去。端口通常用一个冒号(:)来表示。配置选项的名字后跟随了一个=号。如下所示:

  1. var conn = ConnectionMultiplexer.Connect("redis0:6380,redis1:6380,allowAdmin=true");

我们可以自由的在 stringConfigurationOptions 两者之间相互转换,如下所示:

  1. ConfigurationOptions options = ConfigurationOptions.Parse(configString);

或者

  1. string configString = options.ToString();

最常用的方式是将基本信息存储在一个字符串中,然后在运行时应用这个特定的基本信息:

  1. string configString = GetRedisConfiguration();
  2. var options = ConfigurationOptions.Parse(configString);
  3. options.ClientName = GetAppName(); // 仅仅在运行时才知道
  4. options.AllowAdmin = true;
  5. conn = ConnectionMultiplexer.Connect(options);

在微软Azure上使用Redis并附上密码的例子:

  1. 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 设置广播通道名称
configCheckSeconds={int} ConfigCheckSeconds 时间(秒)检查配置;如果支持的话,它可以对交互式套接字进行持久连接
defaultDatabase={int} DefaultDatabase 默认数据库索引, 从 0databases - 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加密
sslProtocols={enum} SslProtocols 使用加密连接时支持的Ssl / Tls版本。使用’ ‘ 提供多个值。
sslHost={string} SslHost 强制SSL主机识别,需要使用服务器端证书
syncTimeout={int} SyncTimeout 异步超时设置(ms)
tiebreaker={string} TieBreaker 主要是在一个模糊不清的主机之间选择出一个作为主服务器
version={string} DefaultVersion Redis 版本级别 (该选项是非常有用的,当服务器不可用时)
writeBuffer={int} WriteBuffer 输出缓存区的大小

其他仅用于代码的选项:

  • ReconnectRetryPolicy(IReconnectRetryPolicy) - 默认值:ReconnectRetryPolicy = LinearRetry(ConnectTimeout);

在配置字符串中的标记都是以逗号分隔的;任何没有 = 符号的都被假定为Redis的服务终端。如果没有开启SSL,并且终端没有指定一个明确的端口,那么将使用6379作为端口;如果开启了SSL,那么6380将作为端口。以 $ 开始的标记会被当做命令来映射;例如:$config=cfg

自动配置与手动配置

在很多常见的情况下,StackExchange.Redis 将会自动的配置多个设置选项,包括服务器类型和版本,连接超时和主/从关系配置。可是有时候在Redis服务器这个命令是被禁止的。在这种情况下,提供更多的信息是非常有用的:

  1. ConfigurationOptions config = new ConfigurationOptions
  2. {
  3. EndPoints =
  4. {
  5. { "redis0", 6379 },
  6. { "redis1", 6380 }
  7. },
  8. CommandMap = CommandMap.Create(new HashSet<string>
  9. { // 排除几个命令
  10. "INFO", "CONFIG", "CLUSTER",
  11. "PING", "ECHO", "CLIENT"
  12. }, available: false),
  13. KeepAlive = 180,
  14. DefaultVersion = new Version(2, 8, 8),
  15. Password = "changeme"
  16. };

上面的配置等同于下面的字符串配置:

  1. redis0:6379,redis1:6380,keepAlive=180,version=2.8.8,$CLIENT=,$CLUSTER=,$CONFIG=,$ECHO=,$INFO=,$PING=

重命名命令

在Redis中有些不常用的功能,那就是你能禁用或者重命名单个命令。正如前面的所展示的,这是通过 CommandMap 来实现的,而不是通过 HashSet\Create() (用这个来指示可用和不可用的命令),可以传递一个 Dictionary\。所有不在字典里面命令都被假定为开启且未被重命名。null 或者空值记录的命令表示是被禁用的。例如:

  1. var commands = new Dictionary<string,string> {
  2. { "info", null }, // 禁用
  3. { "select", "use" }, // 由于某种原因重命名为等效的SQL
  4. };
  5. var options = new ConfigurationOptions {
  6. // ...
  7. CommandMap = CommandMap.Create(commands),
  8. // ...
  9. }

上面的配置等同于下面的字符串配置(在连接字符串中):

  1. $INFO=,$SELECT=use

Twemproxy

Twemproxy是一个允许多个Redis实例使用起来像是单个服务一样的工具,它内置分片和容错能力(这很像Redis集群,但是它是单独实现的)。Twemproxy简化了功能设置的可用性。为了避免手动配置,Proxy 选项可以这样配置:

  1. var options = new ConfigurationOptions
  2. {
  3. EndPoints = { "my-server" },
  4. Proxy = Proxy.Twemproxy
  5. };

打破僵局(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 方法,配置消息也可以单独使用主/从更新来请求所有的节点刷新它们的配置。

连接重试策略

当连接由于某种原因丢失时,StackExchange.Redis 会自动在后台尝试连接。它会不断的重试,直到连接重新恢复。它将使用ReconnectRetryPolicy来决定在重试之间应该等待多长时间。ReconnectRetryPolicy可以是线性(默认),指数或自定义重试策略。

例如:

  1. config.ReconnectRetryPolicy = new ExponentialRetry(5000); // defaults maxDeltaBackoff to 10000 ms
  2. //重试 # 重试以毫秒为间隔重新连接
  3. //1 随机值,在 5000 到 5500 之间
  4. //2 随机值,在 5000 到 6050 之间
  5. //3 随机值,在 5000 到 6655 之间
  6. //4 随机值,在 5000 到 8053 之间
  7. //5 随机值,在 5000 到 10000 之间,由于 maxDeltaBackoff 是 10000 ms
  8. //6 随机值,在 5000 到 10000 之间
  9. config.ReconnectRetryPolicy = new LinearRetry(5000);
  10. //重试 # 重试以毫秒为间隔重新连接
  11. //1 5000
  12. //2 5000
  13. //3 5000
  14. //4 5000
  15. //5 5000
  16. //6 5000