缓存雪崩

当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增。

解决方案:

  • 均匀设置过期时间:将过期时间加一个随机数
  • 互斥锁:如果发现访问的数据不在Redis里,就加个互斥锁,保证统一时间内只有一个请求来构建缓存
  • 缓存预热
    若Redis故障宕机,我们可以启动服务熔断机制,暂停业务应用对缓存服务的访问,直接返回错误,不再继续访问数据库,从而降低对数据库的访问压力。

缓存击穿

如果缓存中的某个热点数据过期了,此时大量的请求访问了该热点数据,就无法从缓存中读取,直接访问数据库,数据库很容易就被高并发的请求冲垮。

解决方案:

  • 互斥锁
  • 不给热点数据设置过期时间

缓存穿透

缓存穿透
当用户访问的数据,既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据,没办法构建缓存数据,来服务后续的请求。那么当有大量这样的请求到来时,数据库的压力骤增。

解决方案:

  • 非法请求的限制
  • 将空结果(NULL)或默认查询结果存入到缓存中,并设置值过期时间。
  • 用布隆过滤器快速判断数据是否存在,避免通过查询数据库来判断数据是否存在