redis集群不支持flushall和flushdb,因其违反去中心化设计,无法跨slot协调;keys *则会阻塞主线程数秒,引发超时与雪崩。

为什么不能直接用 FLUSHALL 或 KEYS *
Redis 集群协议层面禁止 FLUSHALL 和 FLUSHDB,执行会报错 ERR unknown command 'flushall' or not supported in cluster mode。这不是配置问题,是设计硬限制——每个 key 归属固定 slot,全局命令无法跨分片协调。KEYS * 更危险:它会阻塞单个主节点主线程,百万级 key 下可能卡住数秒,引发客户端超时、连接池耗尽甚至主从同步中断。
如何精准识别“过期但未清理”的冷数据
别只看 TTL 返回 -1 就认为安全——很多业务写入时没设过期时间,但实际早已弃用(比如测试环境遗留的 temp:job:*)。真正要抓的是两类 key:
-
TTL为 -1 且OBJECT IDLETIME≥ 86400(24 小时)的永不过期 key -
TTL> 0 但已过期(PTTL返回负值)且长期无访问的 key
生产环境必须用 SCAN 分批查,例如:redis-cli -h 10.1.33.101 -p 7001 --scan --pattern "temp:*" | head -n 1000 | xargs -n 100 redis-cli -h 10.1.33.101 -p 7001 object idletime
Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。
用 UNLINK + SCAN 实现无感知批量删除
DEL 是同步删,遇到大 hash(如 5MB 的 user:profile:123)会卡主线程;UNLINK 把释放内存交给后台线程,主线程只做标记,延迟几乎为零。集群中必须对每个主节点单独操作:
- 先获取所有主节点地址:
redis-cli -c -h any-node -p port cluster nodes | grep master | awk '{print $2}' - 逐个直连主节点执行:
redis-cli -h 10.1.33.101 -p 7001 --scan --pattern "temp:*" | xargs -n 1000 redis-cli -h 10.1.33.101 -p 7001 unlink - 跳过从节点:遇到
(error) READONLY You can't write against a read only replica直接忽略,主节点清空后自动同步
删完必须检查 mem_fragmentation_ratio
冷数据删了,内存使用率却没降?大概率是内存碎片在作祟。INFO memory 中的 mem_fragmentation_ratio 若 > 1.5,说明物理内存分配不连续,光删 key 不解决问题。此时要么重启实例(需切流),要么临时启用 activedefrag yes(但会吃 CPU,监控 used_cpu_sys 是否突增)。










