664 字
3 分钟
Redis 的 LRU 和 LFU 有什么区别?
  1. 1Redis 系列导读:知识地图、必会主线与复习顺序
  2. 2Redis 中常见的数据类型有哪些?
  3. 3Redis 通常应用于哪些场景?
  4. 4Redis为什么这么快?
  5. 5Redis 常用的过期时间、删除 Key 命令有哪些?
  6. 6Redis 的过期 Key 是如何被删除的?
  7. 7Redis 内存满了怎么办?有哪些淘汰策略?
  8. 8缓存穿透、击穿、雪崩的区别与解决方案
  9. 9Redis 如何保证缓存与数据库的数据一致性?
  10. 10Redis 的持久化机制有哪些?
  11. 11Redis 主从复制的完整流程是什么?
  12. 12Redis 的哨兵机制是什么?
  13. 13Redis Cluster 模式与 Sentinel 模式的区别是什么?
  14. 14Redis 支持事务吗?如何实现?
  15. 15Redis 中如何实现分布式锁?
  16. 16Redis 的 Lua 脚本功能是什么?如何使用?
  17. 17如何解决 Redis 中的热点 Key 问题?
  18. 18Redis BigKey 有什么危害?如何发现和治理?
  19. 19为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
  20. 20Redis 的 LRU 和 LFU 有什么区别?本文
  21. 21Redis 数据类型和底层编码有什么区别?
  22. 22Redis 中跳表的实现原理是什么?
  23. 23Redis 的 ZSet 为什么使用跳表,而不是平衡树?
  24. 24Redis 的 RDB 快照如何生成?为什么会有写时复制?
  25. 25Redis 的 AOF 刷盘和重写有什么区别?
  26. 26Redis 断线后如何通过 PSYNC 部分重同步?
  27. 27Redis 主从切换为什么会丢数据?WAIT 能解决吗?
  28. 28Redis 集群会出现脑裂问题吗?
  29. 29Redisson 看门狗(watch dog)机制了解吗?
  30. 30Redis Cluster:哈希槽、Gossip 与故障转移
  31. 31Redis Pipeline 为什么能提高吞吐?能保证原子性吗?
  32. 32Redis 的 SCAN 和 KEYS 有什么区别?
  33. 33Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
  34. 34Redis 和 MySQL 有什么区别?
  35. 35Redis 为什么使用 SDS,而不是 C 字符串?
  36. 36Redis 的哈希表如何处理冲突和渐进式 rehash?
  37. 37Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
  38. 38Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?
  39. 39Redis 如何实现限流?固定窗口和滑动窗口怎么选?
  40. 40Redis Stream 如何保证消息消费?ACK 和 PEL 是什么?
  41. 41Redis 删除数据后为什么内存不下降?如何理解内存碎片?

LRU 根据最近一次访问的时间判断热度,LFU 根据一段时间内的访问频率判断热度。最近访问过,不一定长期热门;过去很热门,也不一定现在还热门。 Redis 的实现采用近似算法,减少维护精确全局排序的成本。

用一次访问变化理解差别#

假设商品 A 每分钟被访问一千次,商品 B 平时无人访问,只在刚才被扫描任务读了一次。LRU 可能因为 B 更近被访问而保留 B;LFU 更倾向于识别 A 的持续热度。若热点突然从 A 切换到 C,LRU 能较快体现访问时间变化,LFU 则需要通过频率增长和衰减适应变化。

Redis 不为所有 Key 维护一条严格的 LRU 链表。经典近似 LRU 在候选样本中判断空闲时间,并维护候选信息;maxmemory-samples 调整采样规模,样本更大通常更接近精确选择,但会增加 CPU 工作量。这是准确度与成本的取舍。

LFU 使用有限位数的计数信息,通过概率递增表示热度,避免为每次访问维护无限增长的精确计数;频率随时间衰减,防止曾经的热点永远占着内存。lfu-log-factor 和 lfu-decay-time 会影响增长与衰减,不能把计数值理解为真实访问次数。

策略与范围是两个维度#

allkeys-lru 和 volatile-lru 使用的热度依据相似,但候选范围不同。前者考虑所有 Key,后者只考虑带 TTL 的 Key;LFU 也一样。讨论 LRU/LFU 时,要同时回答“按什么排序”和“从哪些 Key 中选”。

常见追问#

LFU 一定比 LRU 命中率高吗?#

不一定。稳定的高频热点适合频率判断,热点频繁变化或访问分布特殊时结果可能不同。应通过命中率、延迟和淘汰量评估实际负载。

使用 LFU 后还需要 TTL 吗?#

需要。淘汰解决容量问题,TTL 表达缓存有效期;过期和热度不是同一个业务含义。

Redis 为什么不直接实现精确 LRU?#

精确维护每次访问后的全局顺序会增加元数据和更新开销。缓存淘汰允许一定近似,采样通常能以较低成本得到可用结果。

提高采样数是不是越大越好?#

更大的样本可能改善选择,但会消耗更多 CPU;只有在命中率收益足以覆盖成本时才值得调整,不能凭理论一律调大。

Redis 的 LRU 和 LFU 有什么区别?
https://blog.xqcherry.top/posts/interview/redis/redis-lru-vs-lfu/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0