一、缓存穿透
定义:恶意查询不存在的数据,绕过缓存直接访问数据库,导致数据库压力过大3。
解决方案:
- 参数校验:对请求参数进行合法性检查(如格式、范围),过滤非法请求。
- 缓存空值:对查询结果为空的键设置短期缓存(如5TTL=5分钟),避免重复穿透。
- 布隆过滤器(Bloom Filter):使用概率型数据结构预存所有合法键,拦截无效请求。
- 实时监控:对高频未命中请求进行监控,动态调整拦截策略。
二、缓存击穿
定义:热点数据过期瞬间,大量并发请求直接访问数据库3。
解决方案:
- 互斥锁(Mutex Lock):首个线程未命中时加锁,从数据库加载数据后写入缓存,其他线程等待锁释放后直接读取缓存5。
- 逻辑过期:缓存值附加过期时间字段,后台异步更新数据,避免物理过期导致瞬时压力。
- 热点数据永不过期:对极热点数据设置永不过期,通过异步任务定期更新。
三、缓存雪崩
定义:大量缓存同时失效,请求直接压垮数据库3。
解决方案:
- 分散过期时间:为缓存键设置随机过期时间(如TTL=基础时间+随机偏移),避免同时失效。
- 多级缓存:结合本地缓存(如Caffeine)与Redis,层级缓冲降低雪崩风险。
- 高可用架构:采用Redis集群(如哨兵模式、Cluster模式)提升容灾能力。
- 熔断降级:使用Hystrix等工具在数据库压力过大时触发限流或返回默认值。
预防措施总结
- 设计阶段:结合业务场景选择缓存策略,预设容灾方案(如多级缓存、熔断机制)。
- 运维阶段:监控缓存命中率与数据库负载,定期优化过期时间和热点数据分布。
- 代码层面:规范缓存读写逻辑,确保空值缓存、锁机制等正确实现