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

114 阅读2分钟

缓存穿透

首先说什么是缓存穿透?当请求的key,redis中查不到,数据库也查不到。此时就是缓存穿透。如果有黑客使用大量不存在的key访问数据,那么就会造成不断地去查询数据库。使数据库压力倍增。

解决方案:

  1. 我们将没查询到的也放入redis中,虽然这样能解决。但是在不存在的key是随机的,那么我们就要为每一个随机不存在的key创建缓存。这样就会导致一个问题,使redis内部有大量无用的key,十分占用内存。也有解决方法,将过期时间设置的短点。
  2. 引入布隆过滤器,我们这里简单说一下布隆过滤器,他的作用就是帮助我们判断数据库是否存在某一个数据。 原理就是,其内部使用了一个位数组,每一个位默认都是0,我们首先会把数据库中的所有数据,这里以主键id为例,把所有id存在布隆过滤器中。这里的存储不是直接存数据哈,布隆过滤器使通过多个不同的hash算法,对id算出不同的数组下标,假如1这个id,经历4次不同hash,算出来的下标分别是0,5,12,19 布隆过滤器就会将这四个下标上的0全部改为1。 此时如果一个key过来首先会进入布隆过滤器进行判断,只有当算出来的结果下标上全是1,才代表数据库中可能有数据,如果有一个为0就不可能存在数据,就直接返回了。

缓存击穿

这个是由于某一个热点key在redis中过期了,恰好在这时有大量用户查询该key,那么就会使大部分请求去请求数据库,增加数据库的压力。比如我们常见的秒杀,大家都在疯狂点。

解决方案:

  1. 实时监控热点key,进行过期时间的调整
  2. 给这个热点key不设置过期时间。

缓存雪崩

这个也是导致很多用户的请求直接打到数据库了,不过和击穿不同的是击穿是某一个热点key,而缓存雪崩是大量key同时过期,那就可能有大量的访问打到数据库了。还有种情况 就是redis宕机了,所有请求打到数据库了。

解决方案:

  • 在设置过期时间时,给过期时间加上一个随机值,这个值短,不过得有。
  • 针对宕机的情况我们可以搭建redis集群。