Redis 缓存

缓存雪崩

  • 大量缓存数据同时过期
  • Redis 服务宕机

在以上两种情况下,大量请求进来后直接访问数据库,导致数据库宕机,进而可能导致整个系统崩溃。

大量缓存同时过期

应对方法:

  1. 均匀地设置过期时间:在对缓存数据设置过期时间时,给这些数据的过期时间加上一个随机数
  2. 互斥锁:如果发现访问的数据不在 Redis 里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存,这样当缓存不存在时,只有一个请求到达数据库,其它请求则阻塞等待。(锁需要设置过期时间)
  3. 后台更新缓存:将更新缓存的工作交由后台线程定时更新,往往在启动时就先进行缓存预热。
    1. 方法一:后台定时检测缓存是否失效,如果失效了则更新;
    2. 方法二:业务发现缓存失效后,通过消息队列通知后台线程更新缓存;

Redis 服务宕机

  1. 方法一:启动服务熔断机制,暂停业务应用对缓存服务的访问,直接返回错误,不用再继续访问数据库;
  2. 方法二:限流,保证到达数据库的请求不超过数据库的负载;
  3. 方法三:构建 Redis 集群;

缓存击穿

热 key 失效:

  • 互斥锁方案,保证同一时间只有一个业务线程更新缓存。
  • 不给热点数据设置过期时间,由后台异步更新缓存,或者在热点数据准备要过期前,提前通知后台线程更新缓存以及重新设置过期时间;

缓存穿透

缓存不存在且无法构建。

比如用户访问的数据既不在缓存中,请求数据库后也无法获取。

可能原因:

  1. 业务操作有误
  2. 恶意攻击

解决方案:

  1. 非法请求限制:在入口处就进行参数检查;
  2. 缓存空值或默认值:即便无法获取到真正的需求数据,也直接在缓存中加入一个默认数据;
  3. 布隆过滤器: