在项目中使用 Redis 作为缓存层时,通常会遇到哪些典型问题?请结合你的实际经验,谈谈这些问题出现的原因以及你采取的解决措施。
考察说明
考查对 Redis 缓存常见问题(缓存穿透、击穿、雪崩、一致性等)的理解,以及在实际项目中定位和解决问题的能力。
回答思路
- 【回答框架 1】缓存穿透指查询不存在的数据,请求直接打到数据库。常见解决:缓存空值并设置较短过期时间,或使用布隆过滤器预先拦截。
- 【回答框架 2】缓存击穿指热点 key 过期瞬间大量请求穿过缓存。常见解决:互斥锁重建缓存,或设置逻辑过期时间,保证单线程重建。
- 【回答框架 3】缓存雪崩指大量 key 同时过期或 Redis 宕机导致请求直达数据库。解决:过期时间加随机值分散,构建高可用集群,并设置熔断降级。
- 【回答框架 4】缓存与数据库一致性需根据业务选择策略。常见方案:先更新数据库再删缓存,配合延迟双删;或使用消息队列异步更新,最终一致。
- 【关键点 1】区分穿透、击穿、雪崩的定义和应对手段。
- 【关键点 2】缓存空值或布隆过滤器可降低穿透风险。
- 【关键点 3】互斥锁或逻辑过期应对击穿。
- 【关键点 4】随机过期时间和集群高可用缓解雪崩。
- 【关键点 5】一致性方案需结合实际业务场景,通常采用最终一致。
- 【易错点 1】布隆过滤器存在误判,不适合精确判断场景。
- 【易错点 2】缓存空值可能导致短期内存压力,需设置合理过期时间。
- 【易错点 3】延迟双删不能绝对保证一致性,极端情况下仍有短暂不一致。