🚀 一、Redis 内存淘汰策略总览(8 种)
Redis 只在 内存满(到 maxmemory) 时触发淘汰。
分两大类:
🟩 ① 针对“设置了过期时间的 key”(常用)
| 策略 | 说明 |
|---|---|
| volatile-lru | 在过期集合中挑最近最少使用的 key |
| volatile-lfu | 在过期集合中挑最少频次访问的 key |
| volatile-ttl | 在过期集合中优先删除“快要到期”的 key |
| volatile-random | 在过期集合中随机删 |
🟥 ② 针对“全体 key”(包含不过期 key)
| 策略 | 说明 |
|---|---|
| allkeys-lru | 在所有 key 中挑最近最少使用的 key |
| allkeys-lfu | 在所有 key 中挑最少访问频次的 key |
| allkeys-random | 所有 key 中随机删除 |
| noeviction | 不删除,直接报错(返回 OOM 错误) |
这八个策略你必须一口背下来,这是 Redis 面试最容易出“背诵题”的地方。
🎨 二、图解(分类图 + 原理图)
🖼 1. 策略分类图
Redis 淘汰策略(8 种)│┌────────┴────────┐针对只对“带过期时间 key” 针对“所有 key”│ │┌────────┼────────┐ ┌───────┼─────────┐
volatile-lru volatile-lfu allkeys-lru allkeys-lfu
volatile-ttl volatile-random allkeys-random noeviction
🖼 2. LRU 图(最近最少使用)
[Key1] → [Key2] → [Key3] → [Key4]最近访问 最久未访问
淘汰:从右边删
🖼 3. LFU 图(访问频率)
访问次数:
KeyA:1 次
KeyB:5 次
KeyC:10 次
KeyD:2 次淘汰:删访问次数最少的 → KeyA
🖼 4. volatile-ttl 图(删除 TTL 最短的)
KeyA:TTL = 90s
KeyB:TTL = 3s ← 最快过期
KeyC:TTL = 45s淘汰:KeyB
🧩 三、每种策略的业务使用场景
1)allkeys-lru(最常用)
缓存场景首选,适合热点数据明显。
例如:
- 商品详情缓存
- 用户信息缓存
- 内容阅读缓存
- Feed 流热点读取
优势:
- 热点数据永远在内存
- 淘汰最久没访问的 key
- 不依赖 TTL(可以不用设置过期)
2)allkeys-lfu(Redis 4.0+)
热点访问具有“长期”倾向的场景。
例如:
- 推荐系统:爆款文章
- 视频平台:长期热门内容
- 直播间信息:用户一直点同一个房间
比 LRU 更精准(避免偶发突刺访问导致缓存污染)
3)volatile-lru
只在“过期 key 集合”里淘汰。
适合:
- 大多数 key 都设置 TTL
- 少量 key(例如配置)不想被淘汰
4)volatile-ttl
优先删除“马上过期的 key”。
适合:
- 大批量定时自动过期的数据
- 秒杀场景中的临时库存 key
- 登录态 key(快过期就删掉没事)
5)volatile-random / allkeys-random
随机删除。
基本只在“实验场景”用。生产一般不用。
6)noeviction
内存满 = 写入失败。
适合:
- Redis 被当作 消息队列
- Redis 做 持久性计数器
- 内存不能随便删(如广告扣费、计费系统)
多数恢复方案:
- 加内存
- 扩容集群
🔥 四、面试必问:Redis 淘汰策略与业务场景如何选择?
📌 缓存业务(高并发读多写少)
👉 allkeys-lru(99% 场景选它)
📌 有热点但追求更稳定的命中率
👉 allkeys-lfu
📌 必须保留某些不设置过期时间的 key
👉 volatile-lru / volatile-lfu
📌 数据天然有 TTL,快过期无所谓
👉 volatile-ttl
📌 强一致性计费、上下文、计数器
👉 noeviction
🧠 五、面试高频追问(我帮你准备好答案)
❓ Q1:为什么建议 allkeys-lru 而不是 volatile-lru?
因为:
- 许多缓存 key 本来就不一定设置 TTL
- volatile-lru 只在 TTL 集中删 key
- 没 TTL 的 key 越堆越多 → 其实更容易 OOM
👉 allkeys-lru 更稳定可靠。
❓ Q2:Redis 4.0 引入 LFU 的目的?
因为 LRU 会被“偶发热点”污染。
例如有人刷接口一次性读 10 万个冷数据,LRU 就错乱了。
LFU 能识别:
- 真正的热点(多次、长期)
- 偶发高峰不会影响驱逐逻辑
❓ Q3:选错策略会怎样?
- 命中率下降(最直接结果)
- QPS 降低
- 回源数据库压力暴涨 → 雪崩
选对策略有时比扩容更有效。
🏁 六、终极总结(背就完了)
Redis 内存淘汰策略 8 种:
volatile-lru / volatile-lfu / volatile-ttl / volatile-random
allkeys-lru / allkeys-lfu / allkeys-random / noeviction常用:
allkeys-lru(缓存)
allkeys-lfu(热点更稳定)不常用:
random、ttl不用:
noeviction(除非你真的需要强一致)触发条件:
内存达到 maxmemory 才会淘汰