解决Redisson WriteRedisConnectionException异常

0 次阅读

Redisson作为Java生态中常用的Redis客户端框架,凭借丰富的分布式锁、缓存管理以及异步操作能力,被广泛应用于高并发系统开发。但在实际项目运行过程中,部分开发者会遇到WriteRedisConnectionException异常,导致Redis写入操作失败,影响业务稳定性。

WriteRedisConnectionException通常表示Redisson在向Redis服务器发送写命令时,无法成功建立或维持写连接。该问题可能由Redis服务状态、网络环境、连接池配置、客户端参数等多个因素共同导致。正确定位异常原因并采取针对性优化措施,是保证系统可靠运行的关键。

Redisson WriteRedisConnectionException异常表现

当系统出现该异常时,日志中通常会看到类似以下信息:

org.redisson.client.WriteRedisConnectionException:
Unable to write command into connection

或者:

RedisConnectionException:
Unable to connect to Redis server

异常发生后,常见影响包括:

  • Redis数据写入失败;

  • 分布式锁获取失败;

  • 缓存更新异常;

  • 消息队列或任务状态保存失败;

  • 接口响应时间增加甚至超时。

如果该问题频繁出现,通常说明Redis连接稳定性或客户端配置存在隐患,需要进一步排查。

常见原因分析

1. Redis服务不可用

Redis服务器停止运行、重启、故障切换或者负载过高,都可能导致Redisson无法正常发送写请求。

可以通过Redis客户端检查服务状态:

redis-cli ping

正常情况下返回:

PONG

如果无法连接,需要确认:

  • Redis进程是否正常启动;

  • Redis端口是否开放;

  • 主从切换是否完成;

  • 哨兵或集群状态是否正常。

对于生产环境,建议监控Redis实例的CPU、内存、连接数量以及慢查询情况,避免资源不足导致连接异常。


2. Redis连接超时

网络延迟较高或者Redis执行耗时命令时,客户端可能等待超时,从而触发写连接异常。

Redisson默认连接配置可能无法适应高并发场景,需要根据业务调整:

singleServerConfig:
  address: "redis://127.0.0.1:6379"
  connectTimeout: 10000
  timeout: 3000

其中:

  • connectTimeout表示连接Redis服务器的超时时间;

  • timeout表示Redis命令执行等待时间。

如果Redis部署在远程服务器或者云环境中,可以适当提高连接超时时间。


3. 连接池配置不足

在高并发应用中,如果Redisson连接池容量过小,大量请求同时访问Redis时可能出现连接等待甚至写入失败。

例如:

singleServerConfig:
  connectionPoolSize: 100
  connectionMinimumIdleSize: 20

参数说明:

  • connectionPoolSize:最大连接数量;

  • connectionMinimumIdleSize:最小空闲连接数量。

优化建议:

  • 根据业务QPS调整连接池大小;

  • 避免设置过大的连接池造成Redis压力;

  • 观察Redis实际连接数:

redis-cli info clients

重点关注:

connected_clients

如果客户端连接数长期接近Redis最大限制,需要及时扩容或优化连接管理。


4. Redis最大连接数限制

Redis默认最大客户端连接数有限,当连接数量超过限制时,新连接无法建立。

查看当前配置:

redis-cli config get maxclients

修改配置:

maxclients 10000

修改后重启Redis服务使配置生效。

同时需要检查应用是否存在连接泄漏,例如:

  • 创建多个RedissonClient实例;

  • 未正确关闭客户端;

  • 服务重启后连接未释放。

推荐整个应用生命周期只创建一个RedissonClient实例。


5. 网络连接异常

Redis与应用服务器之间的网络问题也是WriteRedisConnectionException常见原因。

可能包括:

  • 网络抖动;

  • 防火墙限制;

  • 安全组规则异常;

  • 云服务器内网通信问题;

  • TCP连接被关闭。

可以通过以下命令测试:

telnet redis-host 6379

或者:

nc -vz redis-host 6379

如果网络连接不稳定,需要检查服务器网络环境。


Redisson配置优化方案

合理配置Redisson客户端参数,可以降低连接异常概率。

示例配置:

singleServerConfig:
  address: "redis://127.0.0.1:6379"
  database: 0
  connectionMinimumIdleSize: 16
  connectionPoolSize: 64
  connectTimeout: 10000
  timeout: 5000
  retryAttempts: 3
  retryInterval: 1500

关键参数:

retryAttempts

表示失败后的重试次数。

例如:

retryAttempts: 3

Redis出现短暂网络波动时,可以自动恢复请求。


retryInterval

表示重试间隔时间。

例如:

retryInterval: 1500

单位为毫秒。

合理设置可以避免Redis瞬间恢复时大量请求同时冲击服务器。


检查Redisson版本兼容性

部分WriteRedisConnectionException问题与客户端版本有关。

例如:

  • Redisson版本过低;

  • Redis版本升级后协议兼容问题;

  • Netty版本冲突。

建议:

  1. 使用稳定版本Redisson;

  2. 检查Redis官方支持版本;

  3. 避免项目中重复引入Netty依赖。

Maven依赖示例:


    org.redisson
    redisson
    3.27.2

如果升级版本,需要在测试环境验证分布式锁、缓存以及异步操作功能。


排查Redis慢命令问题

Redis执行耗时命令时,会阻塞其他请求,导致客户端写入超时。

查看慢查询:

redis-cli slowlog get 10

常见问题:

  • 大量KEYS命令;

  • 超大Hash操作;

  • 单次写入大量数据;

  • Lua脚本执行时间过长。

优化方式:

  • 使用SCAN替代KEYS;

  • 拆分大对象;

  • 控制单次批量操作数量;

  • 优化Lua脚本逻辑。


Spring Boot项目中的处理方式

在Spring Boot中集成Redisson时,可以通过配置文件统一管理参数。

示例:

redisson:
  config: classpath:redisson.yml

创建RedissonClient:

@Bean
public RedissonClient redissonClient() {
    Config config = Config.fromYAML(
        new ClassPathResource("redisson.yml")
    );
    return Redisson.create(config);
}

同时避免:

public void method(){
    RedissonClient client = Redisson.create(config);