Redis 缓存穿透+缓存击穿+缓存雪崩

Redis 缓存穿透+缓存击穿+缓存雪崩

 1. 缓存穿透

缓存穿透是指读的请求在缓存中没有命中,需要从数据库查询,查不到数据则无法写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。例如我们数据库的id都是从1自增的,如果发起id=-1的数据或者id特别大不存在的数据,这样的不断攻击导致数据库压力很大,严重会击垮数据库。

Redis 缓存穿透+缓存击穿+缓存雪崩_第1张图片

  1.2 解决办法:

 

  • 在接口层增加校验:比如用户鉴权,参数做校验,不合法的校验直接return,比如id做基础校验,id<=0直接拦截。
  • 缓存空对象:当存储层不命中后,即使数据库返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,依次保护了后端数据源。

                                                    Redis 缓存穿透+缓存击穿+缓存雪崩_第2张图片

 

  •   布隆过滤器

布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则直接丢弃,从而避免了对底层存储系统的查询压力。 

                                            Redis 缓存穿透+缓存击穿+缓存雪崩_第3张图片

2. 缓存击穿

缓存击穿是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,对数据库的访问压力瞬间增大。

2. 1 解决方案:

  • 设置热点数据永不过期,有更新操作就更新缓存就好
  • 加互斥锁: 使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到分布式锁,因此对分布式锁的考验很大。、

3. 缓存雪崩

3.1 缓存雪崩的解决方法

  •  搭建redis集群,将热点数据均匀分布在不同的Redis节点,即使某一几点挂掉,其他节点还可继续工作。
  •  数据预热, 在服务正式部署之前,先把可能的数据预先访问一遍,这样部分大量可能被访问的数据就会加载到缓存中
  • 设置不同的过期时间,Redis存数据的时候,每个Key的失效时间都加个随机值,保证数据不会再同一时间大面积失效。
setRedis(key, value, time+Math.random()*10000);
  • 限流降级, 在缓存失效后,通过加锁或者队列来控制数据库写缓存的进程数量,例如,对某个key只允许一个线程查询数据和写缓存,其他线程等待。

 

参考:

     1.  什么是布隆过滤器

你可能感兴趣的:(Redis,分布式,redis,缓存,数据库)