redis无冷数据识别能力,需人工定义冷标准(如idletime≥86400)、定位冷键(scan+业务前缀,禁用keys)、安全删除(unlink分批,禁用flush);maxmemory-policy仅兜底,删后须查mem_fragmentation_ratio。

内存告警后,别急着 FLUSHALL —— 那会直接清空所有数据,业务大概率中断。真正有效的清理,得靠“精准识别 + 分层清理 + 策略兜底”三步走。
怎么快速识别哪些 key 是无效的?
无效数据 ≠ 过期但未删除的 key,还包括:长期未访问的冷 key、业务已下线但残留的缓存、重复写入的临时 token。关键不是看 TTL,而是看实际访问热度和生命周期。
-
TTL或PTTL只能告诉你“理论上该过期”,但无法反映是否真被业务弃用(比如一个设置 7 天过期的配置项,实际 2 小时后就不再使用) - 用
redis-cli --scan --pattern "user:*"配合OBJECT FREQ(Redis 4.0+)查访问频次,OBJECT IDLETIME查空闲秒数,比单纯扫EXPIRE更准 - 对高频 key 做采样检查:
DEBUG OBJECT keyname能看到 lru 字段值,结合当前 server 时间戳可估算最后访问时间(注意:该命令仅用于调试,生产慎用) - 优先排查
SCAN出的、TTL返回 -1(永不过期)但IDLETIME> 86400 的 key —— 这类最可能是历史遗留垃圾
为什么不能只依赖定期删除和惰性删除?
因为它们都“不主动、不彻底”:定期删除默认每秒最多执行 10 轮(hz 10),每次只随机抽 20 个带过期时间的 key;惰性删除则完全依赖请求触发 —— 如果某个 key 过期后永远没人 GET,它就一直占着内存。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 当内存使用率已达 95%+,靠默认的
ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 20和maxmemory_samples 5,清理速度远跟不上内存增长 - 从库不会主动删过期 key,主库若延迟高或同步卡住,从库上大量过期 key 会持续存在,
INFO keyspace看不到,但MEMORY USAGE仍计入 -
CONFIG SET hz 100可临时提升扫描频率,但 CPU 使用率会明显上升,需监控used_cpu_sys和used_cpu_user
如何安全地批量清理冷 key?
避免用 KEYS *(阻塞主线程),也别在高峰时段跑全量 SCAN —— 推荐分批 + Lua 原子执行,控制节奏。
- 先限定 pattern:
SCAN 0 MATCH "temp:*" COUNT 1000,逐步迭代,每次最多处理 100 个 key - 用 Lua 脚本封装判断逻辑(例如:TTL 3600 才删),避免多次往返网络开销:
eval "for i, k in ipairs(KEYS) do if redis.call('ttl', k) 3600 then redis.call('del', k) end end" 1 temp:key1 temp:key2 - 对大 hash / zset 结构,用
HSCAN/ZSCAN逐层清理字段或成员,而不是直接 DEL 整个 key —— 防止瞬间内存抖动 - 清理前务必确认这些 key 不在任何业务链路中被隐式引用(比如某些 SDK 会缓存 key 名做本地映射)
内存快爆了,淘汰策略该怎么调?
别直接切到 allkeys-random —— 随机删可能把热 key 干掉。优先选有业务语义的策略,并配合 maxmemory-samples 提升精度。
- 如果大部分 key 都设了过期时间(如 session、验证码),用
volatile-lru或volatile-ttl,前者保活跃,后者清“马上到期”的 - 如果 key 没设过期时间但有明确冷热区分(如商品详情缓存),改用
allkeys-lfu,并把maxmemory-samples从默认 5 提到 10~15,让抽样更准 - 切策略后立刻验证:
CONFIG GET maxmemory-policy,再发几条写命令观察evicted_keys是否开始增长 - 注意:
noeviction下写操作会直接报错(error) OOM command not allowed when used memory > 'maxmemory'.,此时必须先清理或扩容,不能只调策略
真正难的不是删数据,而是判断“该删谁”——过期时间只是起点,访问频次、业务生命周期、结构嵌套深度,共同决定一个 key 是否该被清理。临时扩内存或重启服务只是掩耳盗铃,根子还在数据治理习惯里。










