Redis的过期删除策略和内存淘汰策略详解

在这里插入图片描述

前言

Redis 的过期删除策略(expiration deletion policies)和内存淘汰策略(memory eviction policies)是两个不同的概念,但它们都与内存管理密切相关

🔹 一、过期删除策略(Expiration Deletion Policy)

redis是可以对key值设置过期时间的,因此需要有相应的机制将已经过期的键值对删除,而这个工作就是通过 过期删除策略来完成的。

过期删除策略用于管理设置了过期时间(TTL)的键在到期后如何被删除。

1. 策略类型

Redis 提供三种过期键删除策略:

策略类型描述配置项/方式适用场景
惰性删除(Lazy)只有当客户端访问一个 key 时,Redis 才会检查它是否过期,若过期则删除。默认启用适合大多数场景,资源友好但可能保留大量“垃圾键”。
定期删除(Periodic)Redis 每隔一段时间(默认 100ms)随机抽取一些设置了过期时间的键来检查是否过期并删除。默认启用与惰性结合使用,适合普通业务需求。
惰性 + 定期 + 主动删除(memory-aware)(这里其实是上两者的结合,用于内存不足时结合内存淘汰策略来使用,并没有所谓的定时删除–具体原因我在最后的补充内详细描述了Redis 内存不足且开启内存淘汰策略时,会主动查找并删除已过期键来释放内存。自动行为内存敏感场景的最后防线。

✅ 总结:

•	Redis 默认采用惰性 + 定期 的组合策略。
•	无需显式配置,内建于 Redis 的运行机制中。
•	可通过 DEBUG OBJECT key 查看过期时间。

🔹 二、内存淘汰策略(Memory Eviction Policy)

当 Redis 占用的内存超过 maxmemory限制时,如果仍然要写入新数据,就会触发内存淘汰。淘汰策略决定哪些键会被驱逐删除以释放内存。

1. 相关配置项

# redis.conf 中配置:
maxmemory <bytes>
maxmemory-policy <policy>
•	maxmemory: 限制 Redis 可用的最大内存。
•	maxmemory-policy: 内存淘汰策略。

2. 内存淘汰策略类型(共 8 种)

策略名称描述使用场景
noeviction(默认)不淘汰数据,写操作返回错误适用于只读缓存或希望开发者控制内存的情况。
allkeys-lru所有键中使用 LRU 算法淘汰最近最少使用的键适用于内存作为全量缓存的场景
volatile-lru仅从设置了过期时间的键中,使用 LRU 策略淘汰适合部分缓存需要控制过期
allkeys-random所有键中随机淘汰一个键适用于数据价值相当但内存压力较大时。
volatile-random只从设置了过期时间的键中随机淘汰适合 TTL 逻辑主导缓存的场景。
volatile-ttl从设置了过期时间的键中选择即将过期的键淘汰适用于临时缓存过期优先淘汰。
allkeys-lfu所有键中,使用 LFU(最近最少使用频率)策略淘汰访问频率最低的键适合热点数据缓存场景。
volatile-lfu仅从设置了过期时间的键中使用 LFU 策略淘汰适合高频率缓存但有 TTL 的场景。

🔸 各策略适用场景简表

在这里插入图片描述

✅ 配置示例

maxmemory 512mb
maxmemory-policy allkeys-lru

✅ 小结对比:

分类控制目标删除时机是否配置删除对象范围
过期删除策略TTL 到期键主动/访问无需配置仅限设置了 TTL 的键
内存淘汰策略限内存时释放被动需配置可能涉及所有键

🔹 补充:为什么Redis过期删除策略 没有 定时删除策略?

✅ 正确分类角度说明

实际上,Redis 中并没有真正意义上的「定时删除」机制。

官方 Redis 文档和源代码中明确指出,Redis 删除过期键的方式主要是:

  1. 惰性删除(Lazy deletion)
  2. 定期删除(Active/Periodic expiration cycle)
  3. 主动删除(仅在 maxmemory 达上限后尝试释放空间)

🔍 那「定时删除」是怎么来的?

很多资料说的“定时删除”其实是误解或理论假设:

❌ 错误理解的“定时删除”是指:

当设置了 TTL 后,Redis 会创建一个定时器,到期立刻删除该键 —— 类似于操作系统中的 定时任务(Timer)机制。

👉 这种行为在 Redis 中是不存在的。

原因很简单:为每个键创建一个定时器会极大增加 Redis 的开销和复杂度,特别是在大规模 key 场景下,是不可接受的。
所以, Redis 不会定时精确删除每个 TTL 键,而是周期性+被动触发地清理它们。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卜锦元

白嫖是人类的终极快乐,我也是

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值