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: 5、unanswered-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_WAIT或CLOSE_WAIT状态的连接,可以调整Windows的TCP参数:
    1. 打开注册表编辑器(regedit),找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters。
    2. 添加或修改TcpTimedWaitDelay为十进制30(减少连接释放等待时间),MaxUserPort为十进制65534(增大可用端口范围)。
      修改后重启应用服务器。

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

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:10:15