一篇文章了解Redis内存淘汰机制与过期Key清理

前言

在上篇文章中讲述了内存的易失性催生的持久化机制,解决了数据丢失的问题,这篇文章来讲一下内存的有限性(容量有限)催生的核心机制------内存淘汰机制,以及 key 过期该如何处理?

大家要分清:过期清理是Key 自然到期后的被动回收 ,内存淘汰是内存不足时的主动驱逐

一、内存淘汰机制

1.定义

Redis是内存数据库,内存容量有限(即使是服务器内存,也无法无限制存储数据)。当Redis内存使用量达到配置的"最大内存上限(maxmemory)"时,若再执行写命令(如set、hset),Redis会触发内存淘汰机制,删除一部分符合条件的key,释放内存空间,确保Redis正常运行------这就是所谓的"key内卷"。

2.淘汰机制分类概述

Redis 淘汰策略由maxmemory-policy配置,分为 4 大类 8 种,核心分为「淘汰范围」+「淘汰规则」:

  • 淘汰范围:allkeys-(所有 Key)、volatile-(仅设置了过期时间的 Key)
  • 淘汰规则:LRU、LFU、TTL、随机、不淘汰

3.LRU:最近最少使用(看时间)

核心逻辑:淘汰最久没有被访问的 Key,认为长期不用的 Key,未来使用率极低。

Redis 实现近似 LRU,非严格 LRU:随机采样一批 Key,淘汰采样中最久未访问的,减少性能损耗。

  • allkeys-lru:所有 Key 中淘汰最近最少使用的,通用缓存首选
  • volatile-lru:仅从带过期时间的 Key 中淘汰,保护永久业务 Key。

如图:尽管Akey使用的频次是最高的,但是在LRU里面只看距离当前时间的长短,因此淘汰Akey

4.LFU:最不经常使用(看频次)

核心逻辑:淘汰一段时间内访问次数最少 的 Key,解决 LRU 缺陷:偶尔访问的热点 Key 会被误删

LFU 内置访问频次衰减机制,自动降低长期不访问 Key 的计数,避免历史热点长期占用内存。

  • allkeys-lfu:所有 Key 中淘汰访问频次最低的,命中率优于 LRU,现代 Redis 首选
  • volatile-lfu:仅从带过期时间的 Key 中淘汰。

5.TTL:按剩余过期时间

核心逻辑:仅针对带过期时间的 Key,优先淘汰剩余存活时间最短的 Key,快过期的 Key 提前释放。(既然你设置了过期时间,反正最终会过期,那我就提前扼杀你)

  • volatile-ttl:适用于验证码、临时令牌等短期业务数据。

6.随机淘汰 + 禁止淘汰

  • allkeys-random:所有 Key 随机删除,性能最好但命中率极低,仅测试用;
  • volatile-random:仅带过期时间的 Key 随机删除;
  • noeviction(默认策略):不淘汰任何 Key,内存满后拒绝所有写命令,适合 Redis 作为数据库存储、不允许丢数据的场景。

二、过期 Key 清理

Redis 为设置了过期时间(EXPIRE)的 Key,提供 3 种过期清理方案,实际采用「惰性删除 + 定期删除」组合策略,平衡 CPU 开销与内存占用。

1. 惰性删除(Lazy Delete)

(1)核心原理

Key 过期后不会立刻删除 ,只有当客户端访问该 Key 时,Redis 才校验过期状态:

  • 未过期:正常返回数据;

  • 已过期:直接删除 Key,返回空数据。

(2)优缺点

  • 优点:CPU 极度友好,只有访问时才触发删除,不会额外消耗 CPU 做无效扫描,最大化利用 Redis 单线程性能。

  • 缺点:存在严重内存浪费。若一个过期 Key 长期无人访问,会永久驻留内存,长期积累会导致大量无效数据占用内存。

2. 定时删除(Timed Delete)

(1)核心原理

设置 Key 过期时间时,同步创建定时器,时间一到立即强制删除 Key

(2)优缺点

  • 优点:内存释放最及时,过期即删,无内存残留。

  • 缺点:CPU 压力极大 。Redis 是单线程模型,大量定时器会抢占 CPU 资源,影响正常命令执行,严重降低并发性能,Redis 实际未采用该方案

3. 定期删除(Periodic Delete)

(1)核心原理

Redis每隔固定时间,随机抽取一批设置了过期时间的 Key 进行检查,删除其中已过期的 Key。

  • 不会遍历全量 Key:避免全量扫描阻塞主线程;

  • 扫描频率 / 数量可控:默认每秒执行 10 次,每次随机抽取 20 个 Key,平衡 CPU 消耗与清理效率。

(2)优缺点

  • 优点:弥补惰性删除的内存浪费问题,定时扫描清理过期 Key;同时避免定时删除的 CPU 过载问题。

  • 缺点:存在过期 Key 残留,两次扫描间隔内,过期 Key 仍会占用内存。

4.Redis 最终组合方案:惰性删除 + 定期删除

Redis 默认同时启用这两种策略:

  1. 定期删除:主动扫描清理,避免大量过期 Key 堆积;
  2. 惰性删除 :兜底清理,保证访问时过期 Key 必然被删除。二者结合,实现CPU 开销最小化、内存占用合理化的最佳平衡。

三、总结

1.过期 Key 清理 :Redis 用惰性删除 + 定期删除,平衡 CPU 与内存;定时删除因 CPU 开销过大未采用;

2.内存淘汰机制:4 大类 8 种策略,核心是 LRU(时间)、LFU(频次)、TTL、随机;

3.生产核心原则:过期 Key 靠组合策略兜底,内存淘汰靠 LFU/LRU 保热点,合理配置即可保障 Redis 内存高效稳定。

相关推荐
phltxy2 小时前
Redis 事务
数据库·redis·缓存
康乾隆2 小时前
SQL Server Always On 重新添加从库步骤
数据库·sqlserver
环流_2 小时前
redis核心数据类型在java中的操作
java·数据库·redis
雨辰AI3 小时前
SpringBoot3 项目国产化改造完整流程|从 MySQL 到人大金仓落地
java·数据库·后端·mysql·政务
一个天蝎座 白勺 程序猿3 小时前
存储治理:表空间自动目录创建与国产操作系统生态适配
数据库·kingbasees
2401_884454153 小时前
mysql处理复杂SQL性能_InnoDB优化器与MyISAM差异
jvm·数据库·python
weelinking3 小时前
【企业级】企业级大模型合规实战:数据安全与跨境传输的技术解决方案
数据库·人工智能·机器学习·云计算·github
m0_470857643 小时前
golang如何实现目录大小统计_golang目录大小统计实现方案
jvm·数据库·python
穗余3 小时前
RAG为什么必须用向量数据库?
数据库