高并发项目缓存常见问题

53 阅读2分钟

高并发项目缓存常见问题

a. 穿透: 一般为人为进攻手段

指查询一个不存在的数据,而缓存中没有相应的记录,每次请求都会去数据库查询,造成数据库负担加重。

解决方案
  1. 过滤器-->布隆过滤器基数变大,减少波动 hash均匀,过滤掉不存在的请求,避免直接访问数据库。
  1. 使用缓存空值或特殊值的方法去解决缓存穿透

b. 击穿:

当前热点数据突然过期,导致大量数据直接访问数据库, 此时由于瞬间的高并发,可能导致数据库崩溃。

解决方案:

1、热点数据永不过期--设置定时任务,凌晨2点更新缓存数据【先删除缓存中的数据,再查询数据,再写入缓存】

2、接口限流或者降级

3、分布式锁 -->Zookeeper一基于临时序号节点+监听机制

-->因为项目本身就存在Redis,在不考虑动项目的整体架构,并且对性能要求并不高的情况下, 项目用Redisson实现分布式锁即可满足.

c. 雪崩

单服务崩溃阻塞,导致调用服务的一连串服务全部崩溃,导致数据库压力激增。

解决方案
  1. 分布式锁
  1. 热点数据永不过期
  1. key随机过期时间,避免多个数据同时过期。

3. 缓存一致性的方案

缓存与数据库中数据不一致,可能因数据更新时缓存未及时同步等原因,导致读取到错误数据。 因为实时性的要求,通过最终一致性协同解决不一致问题。

强一致性:添加锁解决问题,但开销很大,可能会出现阻塞导致的性能开销大

弱一致性:

  1. 先更新数据库,再删除缓存,后续等查询把数据库的数据回种到缓存中
  1. 延时双删===>更新数据库之前,删除一次缓存;更新完数据库后,再进行一次延迟删除
  1. 使用Binlog异步更新缓存,监听数据库的Binlog变化,通过异步方式更新Redis缓存