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

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

 1. 缓存穿透

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

  1.2 解决办法:

 

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

                                                    

 

  •   布隆过滤器

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

                                            

2. 缓存击穿

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

2. 1 解决方案:

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

3. 缓存雪崩

3.1 缓存雪崩的解决方法

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

 

参考:

     1.  什么是布隆过滤器

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值