MySQL 里有 2000w 条数据,但 Redis 内存只够存 20w — 谁是赢家?你说了算。
当你只有 20w 的「座位」,但有 2000w 「乘客」想进来 —— 你怎么办?
翻译成人话:Redis 内存就那么大,MySQL 里 2000w 条数据不可能全塞进去。你要是硬塞,Redis 脸一黑直接 OOM 给你看。
所以核心问题是:怎么让 Redis 里只留"最热"的 20w 条?
读流程:
⚠️ 关键:第三步「写回 Redis」如果内存满了,就会触发淘汰策略 — 这才是今天的重点!
Redis 4.0 以前只有 6 种,4.0 之后多了 LFU(后面会说)。先看这 6 个老伙计:
从「设了过期时间」的 key 里,踢掉最久没用的那个
从「设了过期时间」的 key 里,踢掉 TTL 最短的那个
从「设了过期时间」的 key 里,闭眼随机踢一个 — 佛系淘汰
从「所有 key」里挑最久没用的踢掉 — 不管你有没有过期时间
从「所有 key」里随机踢 — 听天由命流
一个都不踢!内存满了就报错 — 你写不进来关我屁事
LRU 的致命弱点:只看「最近有没有用」,不看「用的频率」
举个栗子 🌰:某个 key 一小时前被狂刷 10000 次、但最近 5 分钟没人访问 — LRU 可能把它淘汰掉。但 LFU 知道它是高频热点,会手下留情。
| 维度 | LRU | LFU |
|---|---|---|
| 判断依据 | 最近访问时间 | 访问频率 + 时间衰减 |
| 适用场景 | 常规缓存,无明显冷热分化 | 热点集中,二八分布明显 ✅ |
| 对本题适用性 | ✅ 基本够用 | 🏆 最佳选择! |
Step 1:设置最大内存
# redis.conf maxmemory 2gb # 根据你的 20w 数据量估算
Step 2:设置淘汰策略
# redis.conf — 推荐 allkeys-lfu (4.0+) maxmemory-policy allkeys-lfu # 或者降级到 allkeys-lru (更早版本) maxmemory-policy allkeys-lru
Step 3:运行时动态修改(无需重启)
# 命令行直接改 CONFIG SET maxmemory 2gb CONFIG SET maxmemory-policy allkeys-lfu
💡 核心思想就一句话:别手动管 Redis 里该留啥、该踢啥 — 让 allkeys-lfu 自己算。你只管设好内存上限和过期时间,剩下的交给算法。
🔴 Redis 设 maxmemory 2gb
🔴 淘汰策略选 allkeys-lfu
🔴 写缓存时加 TTL 过期时间
🔴 冷数据自动滚蛋,热数据自动留下
🔴 你唯一要做的:躺着看命中率蹭蹭涨 📈