生产环境部署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参数:- 打开注册表编辑器(
regedit),找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters。 - 添加或修改
TcpTimedWaitDelay为十进制30(减少连接释放等待时间),MaxUserPort为十进制65534(增大可用端口范围)。
修改后重启应用服务器。
- 打开注册表编辑器(
如果以上步骤都没解决,可以用Wireshark在应用服务器抓包,看和Redis之间的数据包是否正常,确认是请求发不出去还是响应收不到。
内容的提问来源于stack exchange,提问作者Andrew Jackson




