直接回答
过期键删除是处理设了 TTL 的键到期后如何清除:Redis 采用"惰性删除 + 定期删除"组合。内存淘汰是内存达到 maxmemory 上限后如何选择键腾空间:按配置的淘汰策略(如 LRU、LFU、随机)执行。前者解决"逻辑过期",后者解决"物理内存不足",是两件事。
展开解析
过期删除两种机制互补:
- 惰性删除:访问键时才检查是否过期,过期则删。省 CPU 但可能让大量过期键占着内存不放。
- 定期删除:后台周期性从过期字典抽样检查并删除一批,控制单次执行时长避免阻塞。两本加在一起仍有漏网之鱼——很久没被访问又没被抽中的过期键,这时靠内存淘汰兜底。
淘汰策略(maxmemory-policy)共 8 种,常用的:
- noeviction(默认):不淘汰,写请求报错,读正常。
- allkeys-lru / volatile-lru:在所有键 / 仅设过期的键中淘汰最久未使用的。
- allkeys-lfu / volatile-lfu(4.0+):淘汰访问频率最低的,比 LRU 更抗偶发流量。
- allkeys-random / volatile-random / volatile-ttl(优先淘汰剩余 TTL 短的)。
实践建议:纯缓存场景用 allkeys-lru/lfu;混有持久数据时必须只设 volatile 系列或 noeviction,防止把不该删的数据删掉。追问:Redis 的近似 LRU(随机采样 + 淘汰池)为何不用精确链表。