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 的数据淘汰策略是内存达到上限时的救急机制,策略选得对,系统才稳得住!
- 随机文章
- 热门文章
- 热评文章
- 心理测试网站的全面指南河南心理测试网站
- 探索高量程智商测试 High Range I.Q. Tests (HRIQ):挑战极限,挖掘潜能
- 【详解】@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案
- Java NoSQL访问系统
- Java WebSocket 聊天系统
- 【Docker游戏】使用Docker部署vue-XiuXianGame文字修仙小游戏
- Java Hibernate ORM系统
- Java Spring Security 权限系统
- 免费测你的性格和《三叉戟》中的谁最像