Redis 三种过期策略全揭秘:定时 / 惰性 / 定期如何协同释放内存?

Redis 三种过期策略全揭秘:定时 / 惰性 / 定期如何协同释放内存?

Redis 数据过期策略详解:定时、惰性与定期清理三剑客!

一、什么是过期策略?

在 Redis 中,你可以通过 EXPIRE、SETEX 等命令为键设置一个“生存时间”(TTL)。当这个时间到了,该键就应该被删除。

二、为什么要有过期策略?

节省内存(Redis 是内存数据库)

实现缓存自动失效

避免脏数据长期驻留

三、三种数据过期删除策略

Redis 为了兼顾性能与内存控制,采用了三种策略组合:

1️⃣ 定时删除(Passive Expiry)

当你设置了 TTL,Redis 会在过期时间点,自动安排删除任务。

优点:及时释放内存

缺点:增加 CPU 负担(尤其键多时)

⚠️ 实际中 Redis 不会仅靠定时删除,否则性能消耗太大。

2️⃣ 惰性删除(Lazy Expiry)

当你 GET key 或访问某个 key 时,如果发现该 key 已过期,这时才删除它。

优点:节省 CPU,无需遍历键

缺点:有内存浪费,没人访问就不会清除

3️⃣ 定期删除(Scheduled/Periodic Expiry)

每隔一段时间(比如 100ms),Redis 会随机抽取一部分设置了 TTL 的 key,检查是否过期,若过期则删除。

如果在这批中,发现过期的 key 比例太高(如超过 25%),Redis 会重复进行清理(最多进行 N 次)。

优点:较为平衡 CPU 和内存

缺点:不能完全及时清理

四、总结:三种策略如何协同工作?

策略类型

触发方式

是否主动删除

是否及时

性能消耗

定时删除

TTL 到期即删除

✅ 是

✅ 是

❌ 高

惰性删除

访问 key 时触发

✅ 是

❌ 否

✅ 低

定期删除

定时检查部分 keys

✅ 是

❌ 否

✅ 中等

Redis 实际使用的是 定期 + 惰性为主,定时为辅的策略组合,以确保在性能与内存释放之间取得平衡。

五、面试高频问题 🧠

❓Q: Redis 中 key 过期了一定会被立即删除吗?

**答:不一定。**如果没有访问该 key,惰性删除不会触发;定期删除也不保证每次都扫到。它最终会被清除,但不一定立刻。

❓Q: 有大量过期 key,怎么快速清除?

可以手动执行:

redis-cli --scan | xargs redis-cli del

或者用新命令:

UNLINK key1 key2 key3 # 异步删除,推荐!

六、常用命令回顾 🧾

SET key value EX 60 # 设置60秒过期

EXPIRE key 120 # 给已有 key 设置过期时间

TTL key # 查看 key 剩余 TTL

PERSIST key # 移除过期时间

七、补充:内存淘汰策略 ≠ 数据过期策略 ❗

数据过期策略是时间到后如何删除键;

而内存淘汰策略是 Redis 达到最大内存限制时,如何选择 key 删除腾空间。

内存淘汰策略详见 maxmemory-policy 配置,和过期机制是两个概念。

八、总结一句话

Redis 的数据过期是通过定时删除、惰性删除和定期删除三种方式协同完成,既要保证内存释放,也要兼顾系统性能。

Redis 数据淘汰策略全解析:内存告急时的抉择艺术

一、什么是数据淘汰策略?

当 Redis 达到设置的 maxmemory 上限后,再写入新数据时,Redis 会根据配置的淘汰策略来决定:

删谁?

怎么删?

不删会怎样?(可能拒绝写入或报错)

二、常见场景举例

面试官问:“如果 Redis 内存满了,会发生什么?”

答:Redis 会执行对应的内存淘汰策略,以确保服务继续运行。

三、配置入口:maxmemory-policy

使用方式:

CONFIG SET maxmemory 100mb

CONFIG SET maxmemory-policy allkeys-lru

你也可以在 redis.conf 文件中配置。

四、六种淘汰策略对比分析

策略名称

策略说明

适用场景

noeviction

不淘汰,直接拒绝写入操作(默认策略)

数据不能丢的场景(如金融)

allkeys-lru

所有键中,淘汰最久未使用的(Least Recently Used)

通用缓存、Web缓存

volatile-lru

只在设置了过期时间(TTL)的键中,淘汰最久未使用的

局部热数据缓存

allkeys-random

所有键中随机淘汰

对访问频率无强依赖的缓存

volatile-random

只在设置了过期时间的键中随机淘汰

弱一致性、低优先级缓存

volatile-ttl

只淘汰 TTL 剩余时间最短的 key(即快要过期的 key)

想优先保留长期 key

五、LUR/随机策略内部机制

✅ allkeys-lru 是最常用的策略

Redis 内部维护了访问信息(LRU/approximate LRU),采用 采样+近似LRU算法:

抽样 5 个 key(默认),比较其访问时间,淘汰最久未使用的。

可以通过 maxmemory-samples 设置样本数(越大越精准,但耗 CPU):

CONFIG SET maxmemory-samples 10

六、实践建议

💡 推荐策略组合:

场景

推荐配置

通用缓存

allkeys-lru(经典)

只缓存部分热点数据

volatile-lru + 设置 TTL

极限性能下,快速释放空间

allkeys-random

数据敏感/不能自动淘汰

noeviction(程序层判断+降级处理)

七、淘汰策略与过期策略的区别

项目

数据过期策略

数据淘汰策略

触发时机

TTL 到期

内存不足

删除方式

删除已过期 key

淘汰部分 key 腾空间

是否主动触发

一般由 Redis 控制

写入数据时被动触发

八、面试 Q&A 常考点 🔥

❓Q: Redis 如何判断哪些 key 应该淘汰?

答:Redis 使用 LRU 或 TTL 等策略,通过采样 key 集合,依据策略决定谁“牺牲”。

❓Q: 为什么默认是 noeviction?

答:防止误删数据。适用于数据不允许丢失的业务,比如计费、账务系统。

❓Q: 如何防止 Redis OOM(内存溢出)?

答:

配置合理的 maxmemory

启用合适的淘汰策略

控制大 key 和大 value

配合过期策略及时释放空间

九、总结一句话

Redis 的数据淘汰策略是内存达到上限时的救急机制,策略选得对,系统才稳得住!

相关作品