redis心跳检测是分层机制:客户端主动ping、服务端tcp保活、协议层验证协同;需按连接类型和客户端库差异化配置,订阅连接须绕过ping限制,服务端tcp-keepalive必须显式启用。

普通命令连接的心跳配置
适用于执行 SET/GET/PING 等常规命令的连接,核心是让客户端周期性发 PING 并校验响应。
-
node-redis@4.6+:启用
pingInterval(单位毫秒),例如{ pingInterval: 10000 }表示每 10 秒自动发一次 PING;同时建议开启socket.keepAlive: true和socket.reconnectStrategy自定义重连逻辑 -
Redisson:配置
setPingConnectionInterval(30000)(30 秒心跳),搭配setKeepAlive(true)启用系统级 TCP keep-alive -
Jedis:本身不内置定时 PING,需手动轮询或改用
JedisPool配合testOnBorrow=true+testWhileIdle=true,并设置timeBetweenEvictionRunsMillis触发连接有效性检查
订阅连接(SUBSCRIBE)不能用 PING
一旦调用 SUBSCRIBE,连接进入 Pub/Sub 模式,Redis 服务端会拒绝所有非订阅类命令(包括 PING),直接返回错误或静默断开。此时必须绕过协议限制:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 从另一条管理连接执行
PUBLISH __health_check "ping" - 在订阅连接上监听
message事件,设置超时(如 15 秒)等待对应消息;收不到即判定链路异常 - 配合
CLIENT LIST TYPE pubsub(Redis 7.0+)查该连接 idle 时间是否持续增长,超过阈值(如 60 秒无新消息)则触发重建 - node-redis 中
pubClient.isOpen和pubClient.isReady仅表示 TCP 层就绪,不能代替应用层存活判断
服务端 TCP 层保活必须开启
即使客户端做了 PING,若服务端内核未启用 TCP keep-alive,空闲连接仍可能被中间设备(NAT、防火墙、负载均衡)悄无声息地回收:
- 修改 Redis 配置文件
redis.conf,设置tcp-keepalive 300(单位秒),表示每 5 分钟发一次 TCP 探测包 - 该值默认为 0(禁用),生产环境务必显式开启,尤其在长连接订阅场景中
- 注意:它只保活 TCP 连接,不保证 Redis 协议状态(比如订阅是否还生效),需与上层心跳策略配合
Kubernetes 或监控系统中的健康探针
外部系统(如 K8s livenessProbe)不能只检查端口通不通,必须走 Redis 协议:
- 使用
exec探针调用redis-cli -h 127.0.0.1 -p 6379 PING,并匹配输出PONG - 加
timeout 3防止卡死,设failureThreshold: 3避免瞬时抖动误判 - 集群环境需额外验证槽位映射完整、节点状态为
connected,不能只查单点










