浅谈redis 缓存雪崩 穿通和击穿

在我们的项目中,经常会遇到(尤其是电商首页数据或热点数据)会用redis缓存,那么我们就要了解redis的缓存 雪崩 穿透和击穿

  1. 缓存雪崩:是指在某一个时间段,缓存集中过期失效。因为像这种数据存入缓存,一般都是使用定时任务去刷新(定时去存入),或者是在查询不到后再加入缓存,那么缓存的数据有好多失效的时间是很接近的,甚至是一样的

    1.1 . 举个例子:有一批商品定时设置缓存,过期时间很接近,就在晚上11点左右过期,晚上11点有一个秒杀活动,瞬间进来10000个用户,大部分都是来请求这一批商品,恰巧这时缓存过期,完蛋,所有查询都落到DB上面(本来DB只接收没有缓存的数据),这是,DB会报警,DBA还没反应过来,BD挂掉了,然后重启DB,重启之后,又被大量的数据给搞挂了,这就是redis缓存雪崩

    1.2. 处理办法
    a: 处理缓存雪崩简单,在批量往Redis存数据的时候,把每个Key的失效时间都加个随机值就好了,这样可以保证数据不会在同一时间大面积失效
    b: 设置热点数据永远不过期,有更新操作就更新缓存就好了(比如运维更新了首页商品,那你刷下缓存就完事了,不要设置过期时间),电商首页的数据也可以用这个操作,保险

  2. 缓存穿通: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据(正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存, 先去查缓存,缓存不存在,数据又都落在DB上面了)。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库, 每次都这样,并发高点就容易崩掉了, 单机系统可能用postman就可能击垮

    2.1. 解决办法
    a. 在接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等

    b.采用缓存空值的方式,如果从数据库查询的对象为空,也放入缓存,只是设定的缓存过期时间较短,比如设置为60秒

    c. Redis还有一个高级用法布隆过滤器(Bloom Filter)这个也能很好的防止缓存穿透的发生,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return

  3. 缓存击穿:这个跟缓存雪崩有点像,但是又有一点不一样,缓存雪崩是因为大面积的缓存失效,打崩了DB,而缓存击穿不同的是缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞
    3.1. 解决办法
    a.设置热点数据永远不过期

  4. 总结
    一般避免以上情况发生我们从三个时间段去分析下:

    事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。

    事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免MySQL 被打死。

    事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

参考:https://blog.csdn.net/qq_35190492/article/details/102889333

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值