问题

缓存穿透,缓存击穿,缓存雪崩

  • 缓存穿透(多次):频繁查询数据库中不存在的数据。利用此进行攻击,可能压垮数据库;
  • 缓存击穿(一次):缓存过期时大量并发请求;
  • 缓存雪崩:缓存服务重启或大量缓存集中失效,给后端系统(如 DB)带来很大压力;

应对

缓存穿透

  • 缓存空数据;
  • 布隆过滤器,过滤不存在的数据请求;

缓存击穿

  • 互斥锁(redis.setnx),拿锁后查数据库,再缓存;
  • 热门数据不过期;

缓存雪崩

  • 对数据设置不同的过期时间;
  • 互斥锁;

过期策略(过期时)

  • 定期删除,每个 100ms 随机抽取一些设置了过期时间的 key,如果过期就删除。
  • 惰性删除,用的时候检查是否过期,如果过期就删除。

淘汰机制(内存满时)

  • noeviction:不淘汰数据,默认。内存使用达到阀值后,引起申请内存的命令都会报错。
  • volatile-ttl:淘汰将要过期的数据。
  • volatile-lru:淘汰最近最少使用(过期数据)。
  • volatile-lfu:淘汰低使用频率(过期数据)
  • volatile-random:随机淘汰(过期数据)。
  • allkeys-lru:淘汰最近最少使用(全部数据)。
  • allkeys-random:随机淘汰(全部数据)。
  • allkey-lfu:淘汰低使用频率(全部数据)。