版本推荐

最近更新时间:2025-07-01 11:17:01

我的收藏
Lettuce 是一个高性能、异步非阻塞的 Redis Java 客户端,支持 Redis 的多种数据结构和命令,能够显著提升 Redis 操作的性能和响应速度,特别适合在高并发场景下使用。
说明:
腾讯云通过 VPC IP 代理层统一屏蔽了 Redis 底层架构的复杂性(分片/高可用)。客户端访问腾讯云 Redis 实例时,无需配置集群或哨兵模式,而是像连接单节点 Redis 一样,直接访问腾讯云提供的统一入口(VPC IP)。

Lettuce 客户端设计缺陷

从 Spring Boot 2.x 开始,Lettuce 取代 Jedis 成为默认的 Redis 客户端。Lettuce 的默认配置在标准 Redis 部署中可行,但与腾讯云 VIP 的透明高可用架构存在兼容性鸿沟。必须通过强制启用 keepAlive 和 tcpUserTimeout 参数,使客户端连接池能及时响应后端切换,否则将导致故障转移后客户端持续不可用。具体信息,如下表所示。
故障类型
业务场景
Lettuce 版本
核心问题
主动切换
兼容版本升级、代理版本升级、数据迁移
Lettuce 6.1.05之前版本
默认不启用 TCP Keepalive(探测空闲连接是否存活),导致客户端连接池无法感知后端 VIP 的切换。旧连接仍被保留在池中,即使服务端已完成切换,客户端仍会持续使用无效连接抛出错误。
被动切换
物理机异常宕机
Lettuce 6.3.0之前版本
未配置 TCP_USER_TIMEOUT 参数,当网络闪断或节点宕机时,操作系统可能长时间(默认 ≥30 分钟)保持半开连接。客户端连接池无法及时回收这些"僵尸连接",造成持续报错。

推荐版本

Lettuce 6.3.0版本,单机连接模式,解决了主动切换和被动切换连接池不能及时响应后端切换的问题,配置 keepAlive 和 tcpUserTimeout 参数如下所示。
SocketOptions socketOptions = SocketOptions.builder()
.keepAlive(SocketOptions.KeepAliveOptions.builder()
// 两次 keepalive 间的时间间隔
.idle(Duration.ofSeconds(TCP_KEEPALIVE_TIME))
// 连接空闲多久开始 keepalive
.interval(Duration.ofSeconds(TCP_KEEPALIVE_TIME/3))
// keepalive 几次之后断开连接
.count(3)
// 是否开启保活连接
.enable()
.build())
.tcpUserTimeout(SocketOptions.TcpUserTimeoutOptions.builder()
// 解决服务端rst导致的长时间超时问题
.tcpUserTimeout(Duration.ofSeconds(TCP_USER_TIMEOUT))
.enable()
.build())
// tcp 连接超时设置
.connectTimeout(Duration.ofMillis(redisConnectTimeout))
.build();