Redis6应用问题——缓存穿透,缓存击穿,缓存雪崩问题及解决方案

缓存穿透

多次请求数据库中不存在的数据
在这里插入图片描述
在这里插入图片描述
解决方案:
(1)对空值缓存:如果一个查询返回的数据为空(不管数据是否存在),把空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过5分钟
(2)设置可访问的名单(白名单):使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmaps里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问。
(3)采用布隆过滤器
(4)进行实时监控:设置黑名单限制服务

缓存击穿

大量并发请求缓存中不存在的某一个热点数据,请求打到数据库,导致数据库出现崩溃的现象在这里插入图片描述
解决方案:
(1)预先设置热门数据:在redis高峰访问之前,把一些热门数据提前存入到redis里面,加大这些热门数据key的时长
(2)实时调整:现场监控哪些热门数据,实时调整key的过期时长
(3)使用锁:
1.就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db
2.先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX)

缓存雪崩

大量并发请求缓存中不存在的批量key,请求打到数据库,导致数据库瞬间压力过大,出现崩溃
缓存雪崩和缓存穿透的区别在于:前者针对很多key缓存,后者是某一个key在这里插入图片描述
解决方案:
(1)构建多级缓存架构:nginx缓存+redis缓存+其他缓存(ehcache等)
(2)使用锁或队列:用加锁或者队列的方式来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上,不适用高并发情况

总结:
缓存穿透:大量并发请求数据库中不存在的数据,因为缓存和数据库都不存在,导致一直查询数据库,数据库崩溃。
缓存击穿:redis某个热点key过期了,大量访问使用这个数据,导致数据库访问量过大。
缓存雪崩:在极少时间段查询大量key的集中过期情况

猜你喜欢

转载自blog.csdn.net/weixin_45334970/article/details/122882120