Redis缓存失效的主要原因包括:内存不足导致的自动淘汰策略触发、键过期时间设置不当、网络抖动或客户端断开、大流量写入导致的热点key失效、以及主从复制延迟问题。排查步骤:1.检查内存使用情况和maxmemory-policy配置;2.监控键的TTL值和访问日志;3.使用redis-cli的INFO和MONITOR命令查看实时状态;4.分析慢查询日志和AOF/RDB文件。
原因一:内存不足
当Redis内存使用达到maxmemory上限时,会根据maxmemory-policy策略淘汰键,比如volatile-lru或allkeys-lru,这会导致缓存大量失效。网友分享:我遇到过实例内存只剩10%,直接触发淘汰,业务QPS暴跌90%。解决:增加内存或调整淘汰策略为noeviction,避免写操作失败。
原因二:键过期机制
设置了expire的键到达TTL后自动删除,如果批量设置相同过期时间,会出现缓存雪崩。论坛帖子原文:昨天凌晨3点,全站缓存失效,查日志发现10万键同时过期,数据库扛不住。排查:用redis-cli --scan --pattern '*' | xargs redis-cli ttl,发现TTL为负的键已过期。经验:随机化TTL,如expire key $((RANDOM % 100 + 300))。
原因三:网络和连接问题
客户端连接超时或网络分区导致get操作失败,返回null误判为缓存失效。真实案例:阿里云Redis,跨区访问延迟超5s,客户端重试机制失效。指南:设置连接池timeout和retry,监控ping延迟,用netstat检查连接数。
原因四:高并发热点key
热门商品key被海量请求穿透,频繁del或set覆盖旧值。网友吐槽:双11活动,单个key 1w QPS,expire 60s内被覆盖无数次。排查命令:redis-cli --bigkeys,找出大key;用pipeline批量操作减压;加本地缓存二级屏障。
原因五:持久化与主从同步
AOF重写或主从全量同步时,短暂不可用导致失效。从库延迟常见于大key同步。帖子分享:从库落后主库2小时,读从穿透严重。解决:开启wait命令确保同步,用sentinel高可用。
原因六:代码层bug
误删缓存,如更新库存后del错key,或多线程并发set。案例:Java jedis在分布式锁下,unlock时多删了其他key。建议:用pipeline原子操作,日志记录所有set/del。
FAQ
Q: Redis缓存失效怎么快速定位key?
A: 用redis-cli keys "*商品*" | xargs redis-cli ttl,列出相关key过期时间。
Q: 缓存雪崩怎么防?
A: 设置不同TTL随机化,增加互斥锁或本地兜底缓存。
Q: 内存淘汰策略选哪个?
A: 读多场景volatile-lru,内存紧张用allkeys-random。
Q: 主从延迟怎么查?
A: INFO replication看offset差值,大于1MB需优化网络带宽。