Redis eviction-policy 怎样选择 LRU 或 LFU
所有键都能从权威数据源重建、暂时没有明确访问模型时,可从 allkeys-lru 建立基线;若有一批持续反复访问的热点、同时夹杂大量偶发访问,则值得对照试用 allkeys-lfu。这不是“LFU 比 LRU 高级”的排序,而是用最近访问还是近似访问频率,预测下一次会用到什么。
Redis 官方地址:https://redis.io/
本文的命令用于有管理权限、可丢弃数据的隔离测试实例,不直接套用线上;示例没有在本文环境执行,也没有预设任何命中率提升结果。实际参数名为 maxmemory-policy,不是名为 eviction-policy 的配置项。
命中下降时先确认是不是淘汰造成的
先问缓存未命中是否真的由容量淘汰造成。近期新增一批冷数据、TTL 变短、业务请求换了一类,都可能让命中率下降,改 LRU 或 LFU 未必解决。
# 在已配置连接信息的测试实例读取实际配置,不假设当前策略 redis-cli CONFIG GET maxmemory-policy redis-cli CONFIG GET maxmemory redis-cli CONFIG GET maxmemory-samples # 保留同一实例的观测起点,稍后取同样的信息计算增量 redis-cli INFO stats redis-cli INFO memory
evicted_keys 是因 maxmemory 限制而淘汰的键数,expired_keys 是过期事件数。比较同一窗口内的变化:淘汰没有明显发生却有大量过期,优先调查 TTL 和请求分布;只有确认容量竞争参与了问题,策略对比才有针对性。字段含义见 INFO 官方说明。
先定候选范围再比较 LRU 和 LFU
策略分成“候选范围”与“选择依据”两层:allkeys 覆盖全部键;volatile 只让带 TTL 的键参加淘汰。LRU 使用最近访问信息,LFU 使用有衰减的近似频率;两者都采用采样近似,不是对全库做精确排名。volatile 没有可用候选时不能凭空释放永久键。
| 负载假设 | 先比较什么 | 需要注意 |
|---|---|---|
| 所有数据都可重建,访问模式尚不明确 | allkeys-lru 基线 | 先建立业务指标,不把默认选择当最终结论 |
| 近期活跃集合不断换新 | LRU 与 LFU 的适应性 | 关注热点换代时的回源压力 |
| 稳定热点夹杂偶发批量读取 | LFU 是否更能保留反复访问的数据 | 这只是测试假设,频率不等于业务价值 |
| 同实例混放不可随意丢失的数据 | 先解决实例隔离与可淘汰范围 | 不要为了命中率切成 allkeys |
这里关于负载的选择是工程判断,不是算法保证。TTL 决定有效期,不等于“到期前不会淘汰”;volatile 中的键也可能提前被容量淘汰。候选范围与近似算法依据 Redis 淘汰文档。

固定容量与访问样本后再切换
用相同缓存容量、相同对象大小分布和相同请求序列,分别观察两种策略。序列至少包括平稳热点、热点换代和一次性读取这几类业务确实会出现的负载;这是对照方案,不是要往生产实例灌数据。
下面仅演示已确认原策略是 allkeys-lru、所有键均可重建时的单变量切换。保留 maxmemory、TTL、采样数和客户端逻辑,不同时改变一串参数。
# 先抄录当前配置;若不是预期的测试实例或原策略,停止本示例 redis-cli CONFIG GET maxmemory-policy redis-cli CONFIG GET lfu-log-factor redis-cli CONFIG GET lfu-decay-time # 仅在上述前提成立时试用 LFU,不在此处降低内存上限 redis-cli CONFIG SET maxmemory-policy allkeys-lfu # 读取当前值只确认配置已切换,不代表命中率已经改善 redis-cli CONFIG GET maxmemory-policy
LFU 的计数是概率近似值,不是精确 GET 次数。lfu-log-factor 控制增长尺度,lfu-decay-time 影响旧热度淡出的尺度。本轮选型先记录二者,不顺手调优,避免无法区分策略和参数的贡献。配置解释参见 Redis 8.6 配置注释。
CONFIG SET 改的是运行时配置,使用方式见 命令文档。若环境不允许该命令,应走该环境支持的配置管理入口,不尝试绕过管理限制。
回退策略不等于恢复缓存现场
# 仅对应原值确认为 allkeys-lru 的测试实例;其他原值必须原样恢复 redis-cli CONFIG SET maxmemory-policy allkeys-lru # 确认恢复的是策略配置,而不是已经淘汰的数据 redis-cli CONFIG GET maxmemory-policy
恢复原配置不能找回刚刚淘汰的键,也不能把访问统计恢复到切换前。Redis 8.6 的对象命令实现明确提醒:LRU 与 LFU 在运行时互换后,相关信息需要时间调整。因此不承诺固定几秒就稳定,也不要频繁来回切换,拿瞬间波动比较优劣。参见 对象信息实现中的切换说明。
测试配置不应自动固化到重启配置。确定长期采用后,再按配置管理流程同步;自管且以配置文件启动的实例可了解 CONFIG REWRITE,它将当前有效配置写回文件,不只是写回这一项。未使用配置文件启动时该命令会报错,不能把它放进通用试验脚本。见 CONFIG REWRITE 文档。
用业务代价决定保留哪种策略
分别记录两种策略的稳定观察窗口。窗口命中率按 Δkeyspace_hits / (Δkeyspace_hits + Δkeyspace_misses) 计算;分母为零就没有可比较样本,计数重置或实例重启则重新开始该窗口。Redis 的实例级命中不能直接代表某个商品接口或某个租户的命中,应同时使用应用侧指标。
把观测拆成三组:缓存观测记录命中增量、淘汰增量;回源观测记录回源请求与回源延迟;决策约束记录错误预算和容量预算。即使命中稍有变化,也要问数据库是否承受更多查询、重要接口是否超时。不同键的重建代价不同,LRU 和 LFU 都不会自动理解业务价值。这些是建议采用的业务判断条件,并非本文测得的表现。

上线前约定回退条件,例如回源延迟或错误率超出团队已有预算就停止扩大试用。没有真实基线时先补监控,不在这里编造通用告警阈值。若访问序列、对象体积或流量比例不一致,记录差异,不把结果归因于一个策略名。
把选型结论写成带条件的记录
决策记录至少保留:哪些键允许淘汰、原策略与候选策略、缓存容量、请求类型、观察窗口、回源代价、回退条件。结论应类似“这类稳定热点的可重建缓存,在相同容量和请求样本下优先继续评估 LFU”,而不是“所有 Redis 都切 LFU”。
带 TTL 的缓存一定要用 volatile 吗?
不一定。TTL 是有效期需求;是否用 volatile 取决于是否要限制淘汰候选。纯缓存也可以用 allkeys,让所有缓存键参与容量竞争。
切 LFU 后命中率没升,是配置没生效吗?
不必然。先确认实际策略,再排除观察期、访问模式和容量条件差异;负载本来不适合 LFU 也可能没有收益。
为了保护业务数据可以只改回 LRU 吗?
不可以这样理解。allkeys-lru 与 allkeys-lfu 都允许淘汰所有键;不可随意丢失的数据首先需要明确的数据保护与部署边界。
Redis 客户端缓存为什么还需要数据变更通知
- 上一篇
- Redis 客户端缓存为什么还需要数据变更通知
- 下一篇
- VS Code Settings Sync 怎样查看当前同步的配置项
-
- 数据库 · Redis | 1小时前 | Redis · redis 缓存失效 CLIENT TRACKING 客户端缓存 数据变更通知
- Redis 客户端缓存为什么还需要数据变更通知
- 367浏览 收藏
-
- 数据库 · Redis | 1小时前 | redis 缓存淘汰 lfu-decay-time OBJECT FREQ LFU
- Redis LFU 淘汰怎样理解计数器衰减
- 282浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis ZMPOP 怎样批量取出有序集合成员
- 333浏览 收藏
-
- 数据库 · Redis | 1小时前 | Redis · redis Redis Cluster Sorted Set ZDIFF WITHSCORES
- Redis ZDIFF 怎样只保留第一个有序集合的独有成员
- 186浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis Streams 怎样用 XACK 设计幂等确认
- 129浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis XADD NOMKSTREAM 怎样避免自动创建空 Stream
- 489浏览 收藏
-
- 数据库 · Redis | 1小时前 | Redis · 消息队列 · XREADGROUP XACK Redis Streams XGROUP
- Redis Streams 怎样用 XREADGROUP 读取消费组消息
- 200浏览 收藏
-
- 数据库 · Redis | 1天前 | Redis ·
- Redis 内存淘汰怎样观察真实驱逐原因
- 360浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 570次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 614次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 641次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 602次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 419次使用
-
- 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浏览

