Redis 过期删除和内存淘汰有什么区别?LRU、LFU 怎么选?
🧑💻 面试官:Redis 设置 TTL,内存满了就自动删到期的键,对吧?
🙋♂️ 我:对,TTL 就是内存淘汰策略。
🧑💻 面试官:没有到期,但内存已经超过限制呢?
🙋♂️ 我:那会把最旧的键删掉。
🧑💻 面试官:“旧”看上次访问、访问次数,还是剩余 TTL?没设过期时间的键能不能被删?
过期问“时间到了没有”,淘汰问“内存够不够”。触发条件和候选范围不同,不能用 TTL 代替淘汰策略。
面试速答(60 秒版)
Redis 过期是 TTL 到了以后让键失效,通过访问时检查和主动过期处理等机制回收,不是给每个键安排一个必须毫秒准时执行的定时器。
内存淘汰则是在达到 maxmemory 相关条件时,按策略选择键释放空间,键可能还没到期。allkeys 策略可从所有键选,volatile 策略只考虑设置了过期时间的键。
LRU 关注最近使用,LFU 关注使用频率;Redis 的这些选择通常是近似实现,不是完整精确排序全部键。noeviction 则不主动淘汰,相关写入可能报错。
选策略前要确认数据能否丢失,以及缓存未命中怎么恢复。重要持久状态不要和可随时重建的缓存混在一起,再期待一个策略同时保护所有数据。

知识点详解:TTL 到期,与内存不足,分别发生什么
时间到,不代表那个毫秒所有内存立刻释放
假设登录临时码设置 60 秒有效。读取时如果已经到期,它应该不能再作为有效值使用;但物理内存何时回收,还涉及主动处理、访问检查和释放方式。
主动过期不等于每轮遍历全部键。后台按机制处理,避免过期回收本身把所有请求长期挡住。因此不能拿 TTL 当精确定时通知,业务动作还需要可靠调度与状态校验。
集中设置相同到期时间,还可能让许多请求同时缓存未命中。时间失效与下游承压也要一起考虑。
淘汰可以发生在还没到期的时候
例如商品缓存本来还能用五分钟,但内存已到限制,配置的淘汰策略可能先把它移除。下次查询要重新加载。
两种机制都可能表现为“键没了”,原因却不同。排查应结合过期数、淘汰数、内存和写入错误,不能只检查 TTL。
maxmemory 也不是操作系统看到的进程内存绝对上限,部分缓冲、复制和持久化开销需预留空间,不能把机器内存全部分给这一个数字。
策略名字里藏着候选范围
allkeys-lru 从所有键里近似选择最近较少使用的键;volatile-lru 只从有过期时间的键里选。后者没有合格候选时,会像 noeviction 一样面临无法腾出空间的问题。
LRU 和 LFU 也不是同义词:一个看近期,一个看频率。短期突发与长期稳定热点下,效果可能不同,应依据访问分布测命中和淘汰。
volatile-ttl 按剩余 TTL 选择候选,也不能理解成“只删已经到期的键”,那属于过期处理。
没有哪种策略会自动替业务判断重要性
如果同一实例里同时有可重建页面缓存和不能随意丢失的协调状态,allkeys 淘汰就可能影响后者。单纯不给关键键设 TTL,也挡不住 allkeys 策略。
可以按数据职责隔离实例或容量,并设计写入失败和缓存恢复。noeviction 保护的是不主动删键,不保证写请求一直成功,也不代替持久化。
验证策略时不要只测最高 QPS。加入接近内存上限、热点变化和集中失效,观察错误、命中、延迟以及下游加载量。
本题机制参考:EXPIRE、Key eviction、Redis 内存管理。
面试官继续追问
没设 TTL 就不会被删吗?
只有特定 volatile 候选规则下,它才不在候选中。allkeys 策略仍可能淘汰;显式删除等行为也另当别论。
LFU 一定比 LRU 好吗?
不一定。需要看访问分布和热点变化,频率有衰减、选择也近似,不能靠名字判断。
noeviction 能保证数据不丢吗?
不能。它只约束内存淘汰,不解决进程故障、持久化和复制丢失,写入也可能被拒绝。
面试速记卡
- 过期:TTL 到时失效与回收。
- 淘汰:内存压力下按策略选键,可能未到期。
- 范围:allkeys 全部键,volatile 有 TTL 的键。
- 算法:LRU 看近期,LFU 看频率,通常近似。
- 边界:maxmemory 非进程绝对内存上限。
公司面试真题
这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。
浏览公司面试真题 →