三个交互演示:① 过期机制可视化 · ② LRU vs LFU 对比 · ③ 8 种淘汰策略沙盒
20 个 Key 各带不同 TTL 倒计时。到 0 后默认仍占着内存,要么靠「访问时惰性删除」,要么靠「后台定期扫描」才会真正消失。
expireIfNeeded 才会真正删除它。hz=10,每 100ms 一轮,每轮抽 20 个带 TTL 的 Key(这里简化为 5 个);如果一轮里过期比例 ≥ 25%,会立刻再抽一轮,直到 25ms 用完。缓存容量都是 3。下方序列从左到右一格一格执行,对比两种算法的淘汰决策:
键空间里同时有「带 TTL 的 Key(黄边)」和「不带 TTL 的 Key(灰边)」。选个策略,点「写入新 Key 触发淘汰」,看哪个被踢出:
volatile-* 系列只在带 TTL 的 Key(黄边)里挑;allkeys-* 系列在所有 Key 里挑。
volatile-* 但所有 TTL Key 都被踢光后再写入,会触发 OOM 写报错(因为没设 TTL 的 Key 不可淘汰)—— 这是生产事故的常见原因!