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的命中率开始急速降低,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制服务

你可能感兴趣的:(数据库,缓存,redis,数据库)