Redis maxmemory-policy 变更前怎么评估已有键的淘汰风险
准备把 Redis 的 maxmemory-policy 从 noeviction 改成某种自动淘汰策略时,先别急着改配置。真正要回答的是:当前实例里哪些键是可重建缓存,哪些键没有 TTL 却承载业务状态,以及内存压力到底来自数据、少数大键还是分配器保留。安全的评估顺序是先读指标,再用 SCAN 抽样,最后用 MEMORY USAGE 对大键定位;只看碎片率或只看键数量都不够。
如果 Redis 同时放缓存和持久业务键,优先把键空间按前缀、TTL 和数据类型分开统计,再决定使用allkeys-*还是volatile-*。没有 TTL 的键在volatile-*下不会自动变成合格淘汰对象。
used_memory_dataset说明数据集大小,used_memory_rss还包含进程与分配器层面的占用。SCAN用于低干扰地抽样键名;MEMORY USAGE用于定位单键或聚合值的内存大户。allkeys与volatile的风险边界不同,策略选择必须结合 TTL 覆盖率和业务键分类。
先把内存上限和真实占用分开看
先保存变更前的基线,至少包括上限、数据集、RSS、淘汰计数和命中情况。Redis 官方文档特别提醒,删除键后分配器不一定立刻把页归还操作系统,因此 used_memory_rss 偏高不等于当前数据集同样大。
# 读取上限、数据集、RSS、碎片和复制/AOF缓冲区线索
redis-cli INFO memory | grep -E 'used_memory:|used_memory_dataset:|used_memory_rss:|maxmemory:|maxmemory_policy:|mem_fragmentation_ratio:|mem_not_counted_for_evict:'
# 读取淘汰、过期和缓存命中基线
redis-cli INFO stats | grep -E 'evicted_keys:|expired_keys:|keyspace_hits:|keyspace_misses:'
# 确认当前策略,不在基线采集阶段改配置
redis-cli CONFIG GET maxmemory maxmemory-policy
判断时把 used_memory_dataset 与 maxmemory 放在一起看;把 used_memory_rss 与碎片字节数、allocator 指标放在一起看。若数据集并未逼近上限,单凭碎片率偏高就切换淘汰策略,往往是在处理错误的问题。

用 SCAN 按前缀看清键空间组成
下一步不是执行 KEYS *,而是按业务前缀做增量扫描。SCAN 的 COUNT 只是每次工作的提示,不保证每次返回固定数量;因此要以完整游标结束后的样本累计为准。下面的示例只抽取一小段缓存键,适合先判断命名和大小分布:
# 只抽样 cache: 前缀,避免一次性把全部键名拉回客户端
redis-cli --scan --pattern 'cache:*' | head -n 200 |
while IFS= read -r key; do
# 先记录类型和 TTL,判断它是否具备过期语义
type=$(redis-cli TYPE "$key")
ttl=$(redis-cli TTL "$key")
printf '%s\t%s\t%s\n' "$type" "$ttl" "$key"
done
把样本按前缀、类型和 TTL 分组。缓存键通常可以重建,但会话、幂等记录或业务状态不能因为名字里带了 cache: 就直接归类为可淘汰数据。若同一实例混合多种用途,先把持久键迁移到独立实例,通常比依赖 volatile 策略兜底更容易解释。
再用 MEMORY USAGE 找出真正的大键
键数量少不代表占用小,List、Hash、Set 和 Sorted Set 里的一个聚合值可能才是压力来源。对抽样键执行 MEMORY USAGE,返回值包含数据和管理开销;嵌套类型默认按样本估算,不能把它当作精确的业务 payload 大小。
# 对一组候选键测量占用,按字节从大到小排序
redis-cli --scan --pattern 'cache:*' | head -n 200 |
while IFS= read -r key; do
# MEMORY USAGE 返回的是该键在 Redis 中的估算字节数
bytes=$(redis-cli MEMORY USAGE "$key")
printf '%s\t%s\n' "$bytes" "$key"
done | sort -nr | head -n 20
大键清单要同时记录数据类型、TTL 和业务拥有者。大键本身不会告诉你应该用哪一种淘汰策略,它只说明某些删除动作可能释放较多空间,也可能造成更明显的缓存重建抖动。生产环境可扩大抽样范围,但要控制 SCAN 频率和 MEMORY USAGE 的调用量。
按 TTL 和键类型判断谁会进入淘汰集合
策略的关键差异在淘汰范围:allkeys-lru、allkeys-lfu 会从全部键中选择;volatile-lru、volatile-lfu 等只考虑带过期时间的键。如果没有键设置 TTL,volatile-* 的行为会接近 noeviction,这不是“策略已生效但 Redis 选错了键”,而是候选集合为空。
| 观察结果 | 优先核对 | 变更风险 |
|---|---|---|
| 缓存键几乎都有 TTL,持久键独立 | TTL 覆盖率、expired_keys、命中率 | 可评估 volatile 系列,但要防止 TTL 过短导致穿透 |
| 缓存和业务键混在同一库 | 前缀归属、无 TTL 键比例、大键清单 | allkeys 系列可能淘汰不可重建数据 |
| RSS 高而数据集未同步增长 | mem_fragmentation_bytes、allocator 指标、历史峰值 | 改淘汰策略未必降低 RSS,应先处理分配器和容量 |

最后保留一次可回退的变更记录:当前策略、目标策略、变更时间、抽样范围和回退条件。切换后继续观察 evicted_keys、命中率、延迟和应用侧缓存重建量;不要因为淘汰计数增加就立即判定失败,也不要只看 Redis 内存下降就认为业务安全。
相关问题
碎片率高到多少才必须改 maxmemory-policy?
没有脱离工作负载的单一阈值。先看碎片字节数、数据集与 RSS 的差额以及历史峰值;如果只是少量字节造成比例偏高,改淘汰策略通常无效。
可以用 DBSIZE 代替大键分析吗?
不可以。DBSIZE 只回答键数量,不能说明键值大小、类型、TTL 或管理开销;大键定位仍要用抽样后的 MEMORY USAGE。
为什么 volatile 策略没有淘汰效果?
最常见原因是候选键没有设置过期时间,或带 TTL 的键已经很少。先按前缀统计 TTL,再结合 evicted_keys 和命中率判断。
Go net.Resolver PreferGo 改变解析结果时怎么排查
- 上一篇
- Go net.Resolver PreferGo 改变解析结果时怎么排查
- 下一篇
- Go RowsColumnTypes 返回长度为 nil 时怎么解释
-
- 数据库 · Redis | 1天前 | Redis · Redis SCAN Redis游标遍历 SCAN全量查询 Redis键空间 COUNT参数
- Redis SCAN 为什么不能当作一次性全量遍历
- 236浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis Lua 脚本怎样通过 KEYS 和 ARGV 区分参数
- 313浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis ZSET 怎样查询分数区间内的成员
- 484浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis Hash 怎样一次读取多个字段并设置 TTL
- 104浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis Stream 消费组为什么重复收到消息
- 463浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis Stream XREAD COUNT 怎样限制单次读取消息数
- 166浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis Stream 怎样查看消费者组待处理消息
- 250浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis JSON.SET 路径不存在为什么没有创建对象
- 204浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis EXPIRE 怎样只在新 TTL 更短时更新
- 244浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis JSON.SET 怎样只在键存在时更新
- 173浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis CLIENT PAUSE WRITE 的主节点切换步骤与写入保护边界
- 458浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis GETDEL 怎样读取后删除键
- 306浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 643次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 674次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 717次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 679次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 510次使用
-
- Redis Stream XTRIM 如何避免消费组积压无限增长
- 2026-09-12 501浏览
-
- Redis AOF rewrite 期间如何判断磁盘与内存压力
- 2026-09-12 501浏览
-
- Redis RDB 和 AOF 怎么按可接受数据丢失量选择
- 2026-09-08 501浏览
-
- Redis XAUTOCLAIM 之后为什么仍有 pending:JUSTID、PEL 与消息删除边界
- 2026-08-29 501浏览
-
- Redis SET 的 GET 与 KEEPTTL 怎么一起验收:旧值返回、续期与回滚边界
- 2026-08-20 501浏览

