Redis的缓存雪崩、击穿、穿透

80 阅读2分钟

一、缓存雪崩

缓存大面积失效,导致数据库宕机,最终引发系统崩溃,称为缓存雪崩

原因

  • 大量数据同时过期
  • Redis宕机(运维方向,不作过多介绍,我也不会)

如何避免

知道了引发缓存雪崩的原因,那我们就可以有针对性的去制定预防措施,对于大量数据过期导致的缓存雪崩,可以通过如下措施进行预防:

  • 均匀设置过期时间
  • 互斥锁
  • 后台更新缓存:缓存永久有效,由后台线程更新缓存。

tips:redis由内存淘汰策略,“永久有效”并不意味着不会被淘汰

内存淘汰策略:而当 Redis 的运行内存已经超过 Redis 设置的最大内存之后,则会使用内存淘汰策略删除符合条件的 key,以此来保障 Redis 高效的运行。

在配置文件中,通过maxmemory来设置最大内存。

总共有8种淘汰策略,根据淘汰数据的范围可以分为两类:

  • 设置了过期时间的数据
    • volatile-random:随机淘汰设置了过期时间的任意键值
    • volatile-ttl:优先淘汰更早过期的键值
    • volatile-lru:优先淘汰最久没有使用的键值
    • volatile-lfu:最少使用的键值
  • 所有数据
    • allkeys-random
    • allkeys-lru
    • allkeys-lfu
    • noeviction:不淘汰数据

二、缓存击穿

热点数据过期,大量请求直接访问数据库,数据库被冲垮

缓存击穿和缓存雪崩其实很像,都是因为缓存过期,所以避免缓存击穿的方式也差不多

  • 互斥锁方案
  • 不给热点数据设置过期时间,后台异步更新缓存

三、缓存穿透

访问的数据,既不在缓存中,也不在内存中

原因

  • 业务误操作(没啥好说的,打工人瑟瑟发抖)
  • 黑客攻击

应对措施

针对于恶意攻击,常见应对方案有三种

  • 非法请求的限制
  • 缓存空值或者默认值
  • 使用布隆过滤器(重点)

重点介绍布隆过滤器,这是个啥玩意儿呢?

布隆过滤器是用于标记数据是否存在于数据库中,布隆过滤器由两个部分组成:位图数组+N个哈希函数,布隆过滤器通过三个操作完成数据的标记:

  • 使用N个哈希函数,对数据进行哈希
  • 将N个哈希值与数组长度进行取模
  • 将取模结果对应的位图数组中的值修改为1

要判断数据是否存在于数据库中,就可以通过判断位图数组中对应的值是否存在0

  • 如果存在0,则数据不在数据库中
  • 如果不存在0,则数据可能不在数据库中(由于存在哈希碰撞)