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


    缓存击穿

    我们通过对数据库的数据进行查询后在redis中缓存,但是在高并发环境下,某个保存的key值在失效的瞬间被大量并发请求访问,这些持续的大并发量就会穿破缓存,直接请求数据库,会对数据库造成巨大压力,这些请求还会使数据多次写入缓存,多了许多不必要的操作。

    解决方法: 

           1. key设置为长期不过期(通过方法监测当并发量达到一个值时对key设置永不过期)

                    (1)预先设置热门数据:在redis高峰访问之前,把一些热门数据提前存入到redis里面,加大这些热门数据key的时长

                    (2)实时调整:现场监控哪些数据热门,实时调整key的过期时长

           2. 加锁排队

                    进程锁

    synchronized同步锁(JVM级别,锁单个线程,其他线程会被阻塞在外)

    +

    双重检查锁(在同步锁前后各有一次检查缓存中key值的语句,以防止上一次线程已经更新过)

                    Redis集群

                               分布式锁

                                        集群部署http://t.csdnimg.cn/VJ4kI

                                        分布式锁http://t.csdnimg.cn/BDJk4

    缓存雪崩

    缓存中的key全部同时过期了,大量的并发请求全部到达数据库,会造成数据库瞬间压力过大,宕机。

    解决方法

    key同时失效

            在加锁排队的基础上给key加随机失效时间

    构建多级缓存架构:nginx缓存 + redis缓存 +其他缓存(ehcache等)

    缓存穿透

    数据在缓存与数据库中都不存在,导致每次请求都会去查询数据库,这些请求的发送者可能是攻击者,会导致数据库压力过大或宕机。

    解决方法

            1.参数效验 没有办法完全杜绝

            2.缓存空对象 不管数据查询结果是否为null都会在redis中缓存(注意设置过期时间,请求的id此时没有不代表以后不会使用)

            3.布隆过滤器 简单理解就是黑名单与白名单

    黑名单就是对不存在或者恶意的请求参数进行存储,下次同样的参数先来到布隆过滤器如果存在会返回空

    白名单参数在布隆过滤器如果存在才会继续执行

                    (布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。

    布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。)

    将所有可能存在的数据哈希到一个足够大的bitmaps中,一个一定不存在的数据会被 这个bitmaps拦截掉,从而避免了对底层存储系统的查询压力。

                    (1)设置可访问的名单(白名单):

    使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问。

                    (2)进行实时监控(黑名单):当发现Redis的命中率开始急速降低,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制服务

  • 相关阅读:
    KingbaseES json操作符
    RSA加密解密算法复习
    SpringBoot项目--电脑商城【收货地址列表展示和设置默认地址】
    PostgreSQL 索引优化与性能调优(十一)
    突如其来的第一个1024要笑着过
    Java多线程并发编程核心知识
    Google Earth Engine(GEE)——利用Landsat 5 每一期影像制作动画时序并附带时间属性
    html 菜单点击切换样式,菜单<a> 控制iframe
    PyTorch基础知识学习
    Clickhouse—MergeTree 数据生命周期
  • 原文地址:https://blog.csdn.net/Z15800020057/article/details/134083207