缓存穿透、击穿、雪崩是怎么实现的,解决的办法有哪些


缓存穿透、击穿、雪崩是怎样产生的呢?比如以下的案例

  • 缓存雪崩:假如某一个商品首页的缓存的数据Key失效时间都是10小时,中午10点刷新的,这时秒杀活动大量用户访问这个数据,假设当时每秒 10000 个请求,本来缓存在可以扛住每秒 5000 个请求,但是缓存当时所有的Key都失效了。此时 1 秒 6000 个请求全部落数据库,数据库还没有反应过来可能就直接挂掉了。如果没有解决分案的话,此时重启数据库的话立马又被新的流量给打挂了。这就是缓存雪崩

  • 缓存穿透:指缓存和数据库中都没有的数据,当用户不断发起请求访问数据库中不存在的数据时,这时的用户很可能是攻击者,连续请求导致数据库压力过大,严重时会击垮数据库

  • 缓存击穿:缓存击穿是指一个Key非常热点,也就是上百万或者上千万的人同时访问这个key的时候,这个key在不停的扛着高并发,高并发集中对这一个key进行访问,当这个Key在失效的瞬间,持续的高并发数据就穿破缓存,直接请求数据库,

缓存穿透、击穿、雪崩解决的分案,比如:

  • 缓存雪崩处理方法:在批量往Redis存数据的时候,把每个Key的失效时间加上随机值,这样可以保证数据不会在同一时间大面积失效,如果Redis是集群部署,将热点数据均匀分布在不同的Redis库中也能避免全部失效的问题,或者设置热点数据永远不过期,有更新操作就更新缓存就好了
  • 缓存穿透处理:在请求接口方法中增加请求数据的校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码return返回,比如:id 做基础校验,id <=0的直接拦截等
  • 缓存击穿处理:设置热点数据永远不过期。或者加上互斥锁

防止缓存穿透也可以使用布隆过滤器实现,原理就是利用高效的数据结构和算法快速判断出这个Key是否在数据库中存在,不存在返回结果就好,存在就去查数据库刷新到redis缓存中再返回客户端

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值