根治方案:1. 调整expire策略,使用懒惰删除+后台定时删除,避免集中过期;2. 设置合理的TTL,根据业务分层缓存,冷热数据分离;3. 开启持久化RDB+AOF,配置合理的策略;4. 集群模式下使用proxy或sentinel高可用;5. 业务侧穿透缓存+限流降级;6. 监控告警+容量规划,预留20%峰值容量。
方案一
Redis的键过期有两种删除策略:惰性删除和定期删除。惰性删除是指在访问键时才删除已过期的键,定期删除是Redis每隔一段时间扫描数据库中一定数量的键,删除其中的过期键。如果定时删除和惰性删除都无法保证及时删除所有过期键,就会导致内存中存储了太多过期键,称为键过期过多。解决方法是:增加expire清理频率,但会增加CPU消耗;或者编写脚本定期清理过期键。
方案二
缓存穿透:查询一个不存在的数据,导致每次都穿透到DB。解决方案:布隆过滤器,接口层对空结果做缓存;缓存击穿:热点key失效,瞬间大流量打到DB。解决方案:key加随机值分散过期时间,二级缓存;缓存雪崩:大量key同一时间失效。解决方案:key设置不同TTL,熔断限流。
方案三
Redis超时通常因为网络延迟、连接池配置不当、慢查询。优化:1. 使用连接池,设置maxTotal/maxIdle/timeout;2. 开启pipeline批量操作;3. 主从异步复制,读从库;4. 增大maxmemory并设置eviction策略allkeys-lru;5. JVM调优,增大堆内存。
方案四
数据丢失主要是主从复制延迟、fork阻塞、AOF重写时丢失。根治:1. 开启AOF,fsync策略everysec;2. 强一致性用Lua脚本;3. 集群用Redis 6.0+ RESP3;4. 业务加本地缓存兜底;5. 监控repl_backlog和offset差值。
方案五
业务中断常见于单点故障、内存满、QPS暴增。方案:Sentinel高可用,3节点集群;预热缓存;热点key隔离到独立实例;使用Codis或Twemproxy分片;告警:连接数、内存使用、慢命令。
方案六
实际案例:某电商双11,Redis雪崩导致DB宕机。应急:流量清洗+降级;长期:TTL抖动+互斥锁+本地缓存;监控Prometheus+Grafana,设置内存80%告警。
FAQ
Q: 为什么Redis会频繁超时?
A: 网络抖动、连接池耗尽、慢命令、内存不足导致阻塞。
Q: 缓存雪崩怎么预防?
A: key过期时间加随机值,避免集中失效。
Q: 数据丢失如何保证一致性?
A: 开启AOF持久化,业务最终一致性。
Q: 单机Redis能扛多少QPS?
A: 10w+,视硬件,集群可线性扩展。