Sunday面试指南

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 非进程绝对内存上限。

公司面试真题

这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历