高并发项目缓存常见问题
a. 穿透: 一般为人为进攻手段
指查询一个不存在的数据,而缓存中没有相应的记录,每次请求都会去数据库查询,造成数据库负担加重。
解决方案
- 过滤器-->布隆过滤器基数变大,减少波动 hash均匀,过滤掉不存在的请求,避免直接访问数据库。
- 使用缓存空值或特殊值的方法去解决缓存穿透
b. 击穿:
当前热点数据突然过期,导致大量数据直接访问数据库, 此时由于瞬间的高并发,可能导致数据库崩溃。
解决方案:
1、热点数据永不过期--设置定时任务,凌晨2点更新缓存数据【先删除缓存中的数据,再查询数据,再写入缓存】
2、接口限流或者降级
3、分布式锁 -->Zookeeper一基于临时序号节点+监听机制
-->因为项目本身就存在Redis,在不考虑动项目的整体架构,并且对性能要求并不高的情况下, 项目用Redisson实现分布式锁即可满足.
c. 雪崩
单服务崩溃阻塞,导致调用服务的一连串服务全部崩溃,导致数据库压力激增。
解决方案
- 分布式锁
- 热点数据永不过期
- key随机过期时间,避免多个数据同时过期。
3. 缓存一致性的方案
缓存与数据库中数据不一致,可能因数据更新时缓存未及时同步等原因,导致读取到错误数据。 因为实时性的要求,通过最终一致性协同解决不一致问题。
强一致性:添加锁解决问题,但开销很大,可能会出现阻塞导致的性能开销大
弱一致性:
- 先更新数据库,再删除缓存,后续等查询把数据库的数据回种到缓存中
- 延时双删===>更新数据库之前,删除一次缓存;更新完数据库后,再进行一次延迟删除
- 使用Binlog异步更新缓存,监听数据库的Binlog变化,通过异步方式更新Redis缓存