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

测试智商的网站 1周前 (08-05) 阅读数 5617 #在线测试

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


一、什么是过期策略?

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


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

  1. 节省内存(Redis 是内存数据库)
  2. 实现缓存自动失效
  3. 避免脏数据长期驻留

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

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

1️⃣ 定时删除(Passive Expiry)

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

优点:及时释放内存
缺点:增加 CPU 负担(尤其键多时)

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


2️⃣ 惰性删除(Lazy Expiry)

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

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

优点:节省 CPU,无需遍历键
缺点:有内存浪费,没人访问就不会清除

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


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 的数据淘汰策略是内存达到上限时的救急机制,策略选得对,系统才稳得住!

  • 随机文章
  • 热门文章
  • 热评文章
热门