Redis超时机制的核心是通过设置key的过期时间(EXPIRE或PEXPIRE命令)来实现缓存自动失效。当key达到TTL(Time To Live)时,Redis会惰性删除(lazy deletion)或定期删除(periodic deletion)它。缓存失效后,如果大量key同时过期,会引发缓存雪崩,导致请求全部打到后端数据库,系统可能崩溃。应对策略包括:1. 设置合理的过期时间,避免高峰期集中失效;2. 采用随机过期时间(TTL + random);3. 引入二级缓存或热点key永不过期;4. 数据库压力平滑,使用熔断器和限流;5. 预热缓存,提前加载热点数据。
来源1
Redis的键超时机制主要依赖于两个删除策略:惰性删除和定时删除。惰性删除是指在访问键时检查其是否过期,如果过期则删除并返回null;定时删除则是每隔一段时间遍历部分键进行删除,以节省CPU。默认情况下,Redis每秒执行10次定时删除任务,每次随机采样20个键,如果过期比例超过25%,则继续采样,否则睡眠。缓存失效时,如果是单个key,没问题,但海量key同时失效,会导致数据库压力暴增,这就是缓存雪崩。
来源2
当Redis缓存失效后,系统行为取决于架构设计。如果未做好防护,客户端会直接查询数据库,导致QPS激增,数据库连接池耗尽,甚至宕机。权威应对策略:1. 为每个key添加随机偏移,如expire(key, 3600 + random(0, 300));2. 热点key不设置过期时间;3. 多级缓存,如本地缓存+Redis;4. 使用mutex锁实现单线程加载缓存,避免缓存穿透;5. 监控Redis内存使用率,及时扩容。
来源3
Redis的过期机制实现上,键的过期时间存储在expires字典中,值为绝对毫秒时间戳。访问时,如果当前时间超过该值,键被删除。定期删除任务在serverCron函数中执行,采样键进行清理。失效后系统行为:高并发场景下,缓存击穿(热点key失效)会导致该key请求全打到DB,雪崩则更严重。策略:预加载热点数据,设置stale-while-revalidate模式,或使用Canal同步DB变更主动更新缓存。
来源4
缓存雪崩是指大量key在同一时刻失效,Redis请求全部forward到后端。行为表现:Redis QPS暴跌,DB QPS暴涨,响应时间拉长。深度解析:Redis 6.0引入了内存淘汰增强,但超时仍靠lazy+periodic。应对:分散过期时间;使用Proxy如Codis分片;后端限流+降级;客户端缓存(如Guava);最终一致性接受,异步重建缓存。
来源5
Redis超时后的教程:设置过期setex key 3600 value;检查TTL ttl key;持久化时,RDB/AOF会记录过期键但加载时检查删除。失效行为:如果lazy删除未触发,内存占用继续;定期删除缓解但不彻底。策略代码示例:构建缓存重建锁if (redis.setnx("lock:key", "1", 10)) { loadFromDB(); }。
来源6
权威解读:Redis不会保证过期键100%及时删除,内存可能超标直到gc或淘汰。失效后,系统需优雅降级,如返回旧数据或降级接口。策略:监控expired_keys事件,分析失效模式;结合Lua脚本原子更新;分布式锁防止多实例重复加载。
FAQ
Q: Redis如何处理key过期?
A: 通过惰性删除(访问时删)和定时删除(采样删)结合。
Q: 缓存雪崩怎么避免?
A: 随机化过期时间,多级缓存,热点永不过期。
Q: 缓存穿透是什么?
A: 查询不存在数据,穿透到DB,使用布隆过滤器防。
Q: TTL命令有哪些?
A: EXPIRE/PEXPIRE设置,TTL/PTTL查询,PERSIST取消。