如果项目中用于提升并发能力的 Redis 缓存服务发生故障,你会采取哪些应对措施?请从缓存降级、数据一致性、系统可用性等方面阐述你的处理方案。
考察说明
考察候选人对缓存故障的容灾能力和系统设计思维。
回答思路
- 【回答框架 1】缓存故障的核心是防止数据库被打垮。首要措施是启用缓存降级策略:当 Redis 不可用时,直接访问数据库,同时可对数据库查询结果进行本地缓存(如 Caffeine)以减轻压力,并设置较短的过期时间。
- 【回答框架 2】需要保护数据库连接和资源。通过限流和熔断机制,如使用 Sentinel 或 Hystrix,对数据库请求进行限流,避免瞬间高并发压垮数据库。同时,对热点数据可进行多级缓存,如本地缓存加分布式缓存,提高容错性。
- 【回答框架 3】在数据一致性方面,如果缓存和数据库之间采用先更新数据库再删除缓存或延迟双删等策略,故障期间应改为直接更新数据库,并确保后续缓存重建的正确性。同时,应对缓存击穿、穿透和雪崩等场景做好预案,比如使用互斥锁、布隆过滤器和随机过期时间。
- 【回答框架 4】在系统架构上,可考虑部署 Redis 高可用方案,如 Sentinel 或 Cluster,以自动故障转移。同时,监控要完善,包括缓存命中率、延迟和错误率,及时发现故障并告警。
- 【回答框架 5】最后,故障恢复后,需要预热缓存,避免缓存重建造成数据库压力。同时,复盘故障原因,优化缓存策略和系统设计,提升整体稳定性。
- 【关键点 1】缓存降级:Redis 不可用时直接访问数据库,并可启用本地缓存兜底。
- 【关键点 2】数据库保护:通过限流、熔断机制防止高并发压垮数据库。
- 【关键点 3】数据一致性:故障期间确保数据库更新正确,缓存重建策略要可靠。
- 【关键点 4】高可用:Redis 集群或 Sentinel 自动故障转移,配合监控告警。
- 【关键点 5】故障恢复:缓存预热和复盘优化,避免二次冲击。
- 【易错点 1】不要让数据库裸奔而无任何保护,需有限流和熔断。
- 【易错点 2】不要忽略缓存击穿、穿透和雪崩的防护。
- 【易错点 3】不要简单认为缓存高可用就能解决全部问题,还需降级和一致性设计。