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

缓存雪崩

指的是应用请求没有命中缓存,导致大量请求打到数据库,导致数据库压力过大,甚至宕机。

产生原因

1.缓存中大量数据同时过期
2.redis实例宕机(单机)

解决方案

1.针对缓存大量失效的情况
有两种方案:
方案1:尽可能的避免设置相同的过期时间
方案2:降级
当发生雪崩时,针对不同的业务场景、不同的数据才取不同的方式:

  • 非核心数据(商品信息),不走db,直接返回预定义信息、空值或者错误信息
  • 核心数据(库存),继续走缓存,或者db
    原则就是缩小访问db的范围。

2.针对redis实例宕机的情况
也是两种方案:

  1. 限流或熔断
  2. 提前预防
方案1 限流或熔断

限流是指禁止部分请求访问数据。
熔断是指中断业务请求对缓存的访问,具体是,调用缓存接口查询时,直接返回,不发命令。直到redis实例重启。

方案2 提前预防

方案1只能在发生雪崩后,减小雪崩的影响范围,并不能避免雪崩的发生,所以需要提前预防。
主要方面为:提高redis可用性。具体方法有:主从模式(sentinal),集群模式(codis、cluster)。


缓存击穿

缓存雪崩是大量缓存失效,击穿则是指对于热点数据的缓存失效,导致请求直接打在db上。雪崩也包含击穿。

产生原因

缓存击穿一般发生在热点数据缓存过期。

解决方案

简单直接,热点数据不设置过期时间,同时也要注意内存使用情况,避免内存占用过多。


缓存穿透

指要访问的数据既不在缓存,也不在数据库,这种"空请求"会占用db连接数,当请求过多会影响并发量。

产生原因

  • 误删除:缓存和数据库的数据都被删了
  • 恶意攻击

解决方案

方案一:用布隆过滤器来判断查询结果是否存在,避免访问数据库。
布隆过滤器的工作原理:
布隆由一个初始值为0的bit位数组和 N 个哈希函数组成,可以快速判断某个数是否存在O(1),当数据写入数据库,对数组进行标记:

  • 首先,n个哈希函数,计算数据哈希值,n个。
  • 接着,n个哈希值对数组长度取模,得到每个哈希值在数组中的位置。
  • 最后,把对应位置的值设为1.
    当某个数据的哈希值对应的位数组值中有一个为0,则说明这个数据不存在。

方案二:请求参数校验
参数不合理等非法请求在参数校验时拦截掉。

标签: none

添加新评论