为Sentinel配置配置ASP.NET Redis会话状态提供程序

时间:2015-09-02 13:13:25

标签: c# asp.net session redis redis-sentinel

我一直试图在我的应用中配置ASP.NET Redis Session State provider一段时间了。由于这篇文章,我终于能够成功地直接连接到master和set / get键:Can't connect to Redis server using ASP.NET Session State Provider

现在,我的下一个问题......让它与Sentinel配置一起使用。

我熟悉SENTINEL get-master-addr-by-name master-dev-sessionstate命令来确定主人。这个提供商是否内置了此功能?基于上面链接的博客文章的评论(这也是我可以找到的唯一文档),似乎我应该能够使用connectionString属性来传递多个主机。不过,我不确定这些多个主机是否打算成为Sentinels。

<connectionStrings>
  <add name="RedisConnection" connectionString="1.2.3.4:5,6.7.8.9:10,abortConnect=false,ssl=false,password=XXXXXX,operationTimeoutInMilliseconds=5000"/>
</connectionStrings>

<sessionState mode="Custom" customProvider="MySessionStateStore">
  <providers>
    <clear/>
    <add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" connectionString="RedisConnection"/>
  </providers>
</sessionState>

像这样配置我的连接时,收到此错误:

  

其他信息:无法连接到redis   服务器(一个或多个);要创建断开的多路复用器,请禁用   AbortOnConnectFail。

即使我的连接字符串中只有主IP,我也会收到此错误。如您所见,我有abortConnect =&#34; false&#34;在我的连接字符串中,这是它指示我做的事情。连接字符串中存在或不存在相同的错误。

考虑到这一点,这是我的问题......

  1. 此提供商是否支持Sentinel配置?
  2. 如果是,连接字符串的正确格式是什么?
  3. 有没有人为此提供任何其他良好的文档资源?我甚至无法在该博客文章之外的微软网站上找到任何内容。
  4. 编辑:我应该注意,这是一个自定义的本地Redis安装。我们没有通过Azure运行。

    编辑:我最近尝试将我的工作配置指向Sentinel并且我收到&#34;没有可用于此操作的连接:EVAL。&#34;这让我相信这个提供商没有Sentinel支持。谁能证实这一点?

2 个答案:

答案 0 :(得分:2)

我正在使用此提供程序进行私有redis安装。据我所知,该提供程序使用StackExchange.Redis.Strongname包和ConnectionMultiplexer进行配置。使用此库,可以使用描述的configuration options。此外,该文档指出目前尚未实现sentinel支持(serviceName)。

尽管如此我想知道为什么你需要与哨兵进行通信,ConnectionMultiplexer能够解析主从设置,参见文档。此外,我通过关闭redis实例测试了这种行为,并查看了网络流量。请查看ConnectionMultiplexer文档:

  

更复杂的情况可能涉及主/从设置;对于此用法,只需指定构成该逻辑redis层的所有所需节点(它将自动识别主节点):   ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(“server1:6379,server2:6379”);

此外,我的配置设置如下:

 <add   name="MySessionStateStore" 
    type="Microsoft.Web.Redis.RedisSessionStateProvider"
    connectionString="XXXXXX:6379,XXXXXX:6379,XXXXXX:6379"  
    applicationName="myFancyApp"ssl="false"/>

关于MS.RedisSessionState Provider,我在site旁边使用了以下教程。

答案 1 :(得分:0)

这是安装nuget包时通常添加到web.config的内容;

sessionState mode="Custom" customProvider="MySessionStateStore">
  <providers>
    <!--
      <add name="MySessionStateStore" 
        host = "127.0.0.1" [String]
        port = "" [number]
        accessKey = "" [String]
        ssl = "false" [true|false]
        throwOnError = "true" [true|false]
        retryTimeoutInMilliseconds = "0" [number]
        databaseId = "0" [number]
        applicationName = "" [String]
        connectionTimeoutInMilliseconds = "5000" [number]
        operationTimeoutInMilliseconds = "5000" [number]
      />
    -->
    <add name="MySessionStateStore" 
         type="Microsoft.Web.Redis.RedisSessionStateProvider"
         host="127.0.0.1" 
         accessKey="" 
         ssl="false" />
  </providers>
</sessionState>

这是我们与Azure缓存服务器一起使用的一个..

<sessionState mode="Custom" customProvider="DefaultSessionProvider">
  <providers>
    <add name="DefaultSessionProvider"
          type="Microsoft.Web.Redis.RedisSessionStateProvider"
          port="6380"
          host="xxxxxxxx.redis.cache.windows.net"
          accessKey="vCG........We0n="
          ssl="true"
          connectionTimeoutInMilliseconds = "5000"
          operationTimeoutInMilliseconds = "1000"
          retryTimeoutInMilliseconds="3000" />
  </providers>
</sessionState>

我们将重试时间设置为3秒,操作时间为1秒,允许3(1000/3000 = 3)次尝试放弃之前。