缓存 / Redis更新于 约 4 分钟阅读 · 执行耗时因环境而异
Redis 内存打满与淘汰:判断是策略、热键还是数据生命周期
Redis 内存问题不能只靠扩大 maxmemory;要识别淘汰策略、无 TTL 数据与热键的增长模式。
维护者 Kevin · Ovalk
适用范围与前提
适用于 Redis 缓存或数据服务;ACL 或托管服务策略可能禁止 CONFIG 等诊断命令。
先确认是否含权威数据,使用已配置的 TLS/认证连接执行只读诊断,不把密码写入命令。
示例不是可以直接粘贴的指令。请替换示例域名、路径、服务名和大写占位符。先收集证据;重载、回滚、清理及执行任务会改变系统状态,需批准影响范围与恢复计划。不要分享凭据或未脱敏日志。
常见症状
- 写入报 OOM command not allowed
- 命中率下降或 evicted_keys 持续增长
- 内存 RSS 显著大于 used_memory
1. 查看内存和淘汰的实际状态
收集 used_memory、maxmemory、mem_fragmentation_ratio、keyspace 和 eviction 指标。确认实例是缓存还是兼任持久化数据;两者的可接受淘汰策略完全不同。
redis-cli INFO memory
redis-cli INFO stats | grep -E "evicted|keyspace"
redis-cli CONFIG GET maxmemory-policy2. 找出增长来源
先按业务前缀抽样,再检查无 TTL 的键与大值。生产环境避免对极大实例无节制执行 KEYS;使用 SCAN 分批采样,必要时在副本上分析。
redis-cli --scan --pattern "*" | head -n 50
redis-cli INFO keyspace3. 选择可回滚的缓解动作
缓存场景可临时限制写入、缩短明确可过期数据的 TTL 或扩容分片;持久化数据场景应先停止错误写入并评估迁移。变更 maxmemory-policy 前,确认应用是否能正确处理 cache miss。
redis-cli SLOWLOG GET 20
redis-cli INFO commandstats解读证据
| 观察结果 | 下一步检查 |
|---|---|
| evicted_keys 累计值很高 | 比较固定时间内的增量及命中率,累计值不能单独证明当前压力。 |
| RSS 高于 used_memory | 检查碎片、分配器及缓冲区,不能直接认为全部差额都是应用泄漏。 |
| 抽样键没有 TTL | 添加过期前区分持久数据设计和缓存写入缺陷。 |
说明性诊断案例
以下假设案例用于解释推理,并非客户真实事故,也不代表已在你的技术环境中测试。
使用 volatile 淘汰策略时写入失败,但大多数键没有 TTL,可能没有可淘汰的键。结合 INFO keyspace 与限定前缀的抽样检查;修复写入生命周期或规划容量。直接改成 allkeys 可能静默删除不应丢弃的数据。
验证恢复
- 在正常流量下验证写入、命中率与延迟,并确认没有意外键丢失。
- 同时观察内存、淘汰与到期速率,并为复制和持久化开销保留进程内存。
回滚与停止条件
记录原策略和限制;回退淘汰策略无法找回已被淘汰的键,允许删除前先确认可重建或有备份。
预防与长期修复
- 为缓存键设置明确 TTL 和命名规范。
- 发布前评估新字段/新键的峰值内存成本。
- 持续监测命中率、淘汰、碎片率和热点命令。
参考资料与纠错
请使用与你安装版本匹配的文档。以下资料解释基础行为,命令仍需结合实际环境验证。
向 Kevin 提交更正,请附页面地址、版本与脱敏复现步骤。请查看编辑原则(英文)。