• 12、缓存穿透、缓存击穿、缓存雪崩


    一、缓存功能

      当系统处于高并发时,为了防止数据库压力过大,引入缓存处理功能,流程如下:

        

       当引入缓存功能后,会引发出问题:(1)缓存穿透,(2)缓存击穿,(3)缓存雪崩。

    二、缓存穿透

          

      解释:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击                     者,攻击会导致数据库压力过大。

      注意:不能避免低频的缓存穿透,可以避免高频的缓存穿透。

      解决办法:

    1. 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
    2. 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null存入缓存中,缺点:当用户不断地以大量不同的key(缓存层和数据库)去访问时,缓存层就会存储大量的(key-null),所以会占用过多的内存,此时需要设置缓存有效期,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击。
    3. 在server端存储一个布隆过滤器,将mysql包含的key放如布隆过滤器中,布隆过滤器能过滤一定不存在的数据。

    四、缓存雪崩

      解释:缓存层在同一时刻,大量缓存的数据同时失效,导致大量的请求跑到数据库。

      导致原因:

      (1)redis中缓存的数据有效期是一致的,然后失效也就是同一时刻。

        解决办法:给每一条数据加上一个随机有效期,不要突然同时失效。

      (2)redis数据库挂掉了

        解决办法:分布式缓存。

    五、缓存击穿

      解释:当缓存层(redis)只缓存了1条数据时,当用户大量的请求过来时,刚好这条数据失效。

            

      解决办法:分布式锁(基于mysql或者基于Zookeeper)

        

  • 相关阅读:
    Caffe 编译
    Caffe 在 Ubuntu 中安装
    【转】git
    Using OpenCV with gcc and CMake
    【转】linux下安装opencv
    【转】shell 教程——07 Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
    【转】shell 教程——06 Shell变量:Shell变量的定义、删除变量、只读变量、变量类型
    python全栈开发-面向对象-初识2
    python全栈开发-面向对象-初识
    python全栈开发-前方高能-内置函数2
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/14322899.html
Copyright © 2020-2023  润新知