缓存击穿
我们通过对数据库的数据进行查询后在redis中缓存,但是在高并发环境下,某个保存的key值在失效的瞬间被大量并发请求访问,这些持续的大并发量就会穿破缓存,直接请求数据库,会对数据库造成巨大压力,这些请求还会使数据多次写入缓存,多了许多不必要的操作。
解决方法:
1. key设置为长期不过期(通过方法监测当并发量达到一个值时对key设置永不过期)
(1)预先设置热门数据:在redis高峰访问之前,把一些热门数据提前存入到redis里面,加大这些热门数据key的时长
(2)实时调整:现场监控哪些数据热门,实时调整key的过期时长
2. 加锁排队
进程锁
synchronized同步锁(JVM级别,锁单个线程,其他线程会被阻塞在外)
+
双重检查锁(在同步锁前后各有一次检查缓存中key值的语句,以防止上一次线程已经更新过)
Redis集群
分布式锁
集群部署
分布式锁
缓存雪崩
缓存中的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里面,进行拦截,不允许访问。文章来源:https://www.toymoban.com/news/detail-717924.html
(2)进行实时监控(黑名单):当发现Redis的命中率开始急速降低,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制服务文章来源地址https://www.toymoban.com/news/detail-717924.html
到了这里,关于Redis缓存击穿、雪崩、穿透的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!