zoukankan      html  css  js  c++  java
  • redis之缓存穿透、雪崩、击穿

    1.缓存穿透

    穿透:

    ​ 是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。而每次查询都是空,每次又都不会进行缓存。假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库。即便是采用UUID,也是很容易找到一个不存在的KEY,进行攻击。如果从数据库查询的对象为空,也放入缓存,只是设定的缓存过期时间较短,比如设置为60秒。

    发生场景:

    ​ redis服务器重启或者大量的缓存在同一时期失效,此时大量的流量会全部冲击到数据库上面,数据库有可能因为承受不住而宕机

    解决办法:

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

    2.缓存雪崩

    雪崩:

    是指在某一个时间段,缓存集中过期失效。

    • 产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间

    比较集中的放入了缓存,假设缓存一个小时。

    • 那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对

    于数据库而言,就会产生周期性的压力波峰。

    • 一般是采取不同分类商品,缓存不同周期。在同一分类中的商品,加上一个随机因子。这样能尽可能分散缓存

    过期时间,而且,热门类目的商品缓存时间长一些,冷门类目的商品缓存时间短一些,也能节省缓存服务的资

    源。

      发生场景:当Redis服务器重启或者大量缓存在同一时期失效时,此时大量的流量会全部冲击到数据库上面,数据库有可能会因为承受不住而宕机

      解决办法:

        1)随机均匀设置失效时间

        2)设置过期标志更新缓存

        3)并发量不是特别多的时候,使用最多的解决方案是加锁排队

    3.缓存击穿

    缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效

    的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

    其实,大多数情况下这种爆款很难对数据库服务器造成压垮性的压力。达到这个级别的公司没有几家的。所

    以,务实主义的小编,

    对主打商品都是早早的做好了准备,让缓存永不过期。即便某些商品自己发酵成了爆款,也是直接设为永不过

    期就好了。

    4.缓存更新

      是一种机制,怎么样保证缓存中的key是实时有效的,以及及时的更新数据资源

      解决办法:

        1)缓存服务器自带的缓存失效策略

        2)自定义:定时去清理过期的缓存;当用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。

    5.缓存降级

      发生场景:当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。

      解决办法:

        在进行降级之前要对系统进行梳理,看看系统是不是可以丢卒保帅;从而梳理出哪些必须誓死保护,哪些可降级;比如可以参考日志级别设置预案:

        (1)一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;

        (2)警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警;

        (3)错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;

        (4)严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。

  • 相关阅读:
    Vue--会员管理列表页面,抽取BASE_URL
    Vue--系统权限拦截
    写译-冲刺班
    看到一篇有收获的博文【关于外挂生涯的忠告】(转载)
    笔记管理-vscode-印象笔记-git-博客园
    1.4条件和循环
    1.3撰写表达式
    1.2对象定义与初始化
    1.1如何写一个c++程序
    send()函数 recv()函数
  • 原文地址:https://www.cnblogs.com/zhuyuanying123--/p/12494386.html
Copyright © 2011-2022 走看看