You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

生产环境部署Redis(Windows版)及Microsoft Redis Session State Provider后连接报错求助

我之前在生产环境遇到过几乎一模一样的问题,结合你的错误日志(No connection is available to service this operation: EVAL; SocketFailure),给你整理几个优先级从高到低的排查和解决步骤:

1. 先确认Redis服务是否还活着

Windows版Redis很容易因为内存过载、系统资源不足或者意外崩溃停掉,这是最常见的原因:

  • 打开服务管理器(运行services.msc),找到你的Redis服务,看状态是不是Running;如果已经停止,先手动启动,观察会不会立刻再次崩溃。
  • 去Redis安装目录找默认日志文件redis-server.log,看崩溃前有没有报错,比如OOM command not allowed(内存溢出)或者系统级的错误提示。

2. 排查网络连通性问题

错误里的SocketFailure说明应用和Redis之间的连接出了网络层面的问题:

  • 在应用服务器上用PowerShell命令Test-NetConnection 192.168.1.10 -Port 6379测试端口是否能连通;如果用telnet的话,先确保telnet客户端已启用,再运行telnet 192.168.1.10 6379
  • 检查Redis服务器的Windows防火墙,确认6379端口的入站规则是允许的,有没有被误改或者禁用。
  • 打开Redis的配置文件redis.conf,检查bind配置项:如果是bind 127.0.0.1,那只有Redis本机能连,内网应用服务器会被拒绝。改成bind 0.0.0.0(允许所有IP访问)或者指定应用服务器的IP,然后重启Redis服务。

3. 调整Redis Session Provider的连接池配置

日志里的outstanding: 5unanswered-write: 1s ago提示连接池可能耗尽或者超时配置不合理:

  • 打开应用的web.config,找到Redis Session Provider的配置节点,类似这样:
    <sessionState mode="Custom" customProvider="RedisSessionProvider">
      <providers>
        <add name="RedisSessionProvider" 
             type="Microsoft.Web.Redis.RedisSessionStateProvider" 
             host="192.168.1.10" 
             port="6379" 
             accessKey="" 
             ssl="false" 
             connectionTimeoutInMilliseconds="5000" 
             operationTimeoutInMilliseconds="1000"
             connectionPoolSize="50" />
      </providers>
    </sessionState>
    
    • 调大connectionPoolSize:如果当前设置得太小(比如小于50),高并发下会耗尽连接,建议改成100-200。
    • 延长operationTimeoutInMilliseconds:默认1000ms太短,Redis响应慢的时候会被标记为失效连接,改成3000-5000ms试试。
      修改后重启应用服务器,观察是否恢复。

4. 检查Redis的内存和持久化配置

如果Redis内存满了或者持久化过于频繁,会导致无法响应请求:

  • 打开redis.conf,找到maxmemory:如果没设置或者值太小,改成服务器内存的70%左右(比如maxmemory 4gb,根据你的服务器配置调整)。
  • 检查maxmemory-policy:默认是noeviction,内存满了之后会拒绝所有写操作(包括Session写入),改成allkeys-lru或者volatile-lru,让Redis自动淘汰旧的键值对释放内存。
  • 调整持久化策略:如果用了RDB,减少自动保存的频率(比如把save 900 1改成save 3600 1);如果用了AOF,关闭appendfsync always改成appendfsync everysec,减少IO压力。修改后重启Redis。

5. 排查应用服务器的TCP连接问题

有时候应用服务器的TCP连接数耗尽也会导致无法创建新的Redis连接:

  • 在应用服务器上运行netstat -ano | findstr :6379,查看和Redis的连接状态,如果有大量TIME_WAITCLOSE_WAIT状态的连接,可以调整Windows的TCP参数:
    1. 打开注册表编辑器(regedit),找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
    2. 添加或修改TcpTimedWaitDelay为十进制30(减少连接释放等待时间),MaxUserPort为十进制65534(增大可用端口范围)。
      修改后重启应用服务器。

如果以上步骤都没解决,可以用Wireshark在应用服务器抓包,看和Redis之间的数据包是否正常,确认是请求发不出去还是响应收不到。

内容的提问来源于stack exchange,提问作者Andrew Jackson

火山引擎 最新活动