Redis5??缓存异常:穿透、击穿、雪崩
2022/4/19 2:12:46
本文主要是介绍Redis5??缓存异常:穿透、击穿、雪崩,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、缓存穿透
缓存穿透:访问的 Key 不存在。
- 查询缓存(Redis)时无法找到指定 Key,因此会请求查询数据库。
- 利用一个不存在的 Key 值进行攻击,会穿透数据库。
解决方案
- 对空值缓存:若查询返回的数据为 null,将结果 null 进行缓存并设置较短的过期时间(通常不超过 5min)
- 设置白名单:使用 bitmaps 定义一个可访问名单。
- 名单 ID 作为 bitmaps 的偏移量。
- 每次访问数据时,将访问者 ID 与 bitmaps 中的 ID 进行比较。
- 若访问者 ID 不在 bitmaps 中则进行拦截。
- 布隆过滤器:哈希函数 + 位图
- 作用:检索一个元素是否在一个集合中。
- 特点:空间效率和查询效率快,但有一定的误识别率和删除困难。
- 做法:将所有可能存在的数据哈希到一个足够大的 bitmaps 中,请求访问不存在的数据时会被 bitmaps 拦截。
- 实时监控:当 Redis 的命中率骤低,需排查访问对象和访问数据,可设置黑名单限制服务。
2、缓存击穿
缓存击穿:访问的某个 Key 缓存过期,且有大量并发请求。
- Key 对应的数据存在,但在 Redis 中缓存过期。
- 此时有大量并发请求数据库访问压力瞬间增大。,则 Redis 会从数据库加载大量数据并缓存。
- 数据库的访问压力瞬间增大。
解决
-
预先设置热门数据:在 Redis 高峰访问前,将热门数据提前存入 Redis 中,增加热门数据 Key 的时长。
-
实时调整:实时监控热门的数据,调整对应 key 的过期时间。
-
锁
3、缓存雪崩
缓存雪崩:访问的多个 Key 缓存过期,且有大量并发请求。
- 击穿:一个 Key
- 雪崩:多个 Key
解决
- 构建多级缓存架构:nginx 缓存 + redis 缓存 + 其他缓存(ehcache等)
- 使用锁或队列:不适合高并发情况(影响效率)
- 使用锁或者队列,避免大量线程同时请求访问数据。
- 从而避免缓存失效时,大量并发请求访问数据库。
- 设置过期标志,更新缓存:设置缓存数据过期的提前量,达到后会通知另外的线程在后台更新缓存。
- 将缓存失效时间错开:
- 在原有失效时间的基础上增加一个随机值。
- 降低每个 Key 的缓存到期时间的重复率。
这篇关于Redis5??缓存异常:穿透、击穿、雪崩的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-08阿里云Redis项目实战入门教程
- 2024-11-08阿里云Redis资料:新手入门与初级使用指南
- 2024-11-08阿里云Redis教程:新手入门及实用指南
- 2024-11-07阿里云Redis学习入门:新手必读指南
- 2024-11-07阿里云Redis学习入门:从零开始的操作指南
- 2024-11-07阿里云Redis学习:初学者指南
- 2024-11-06阿里云Redis入门教程:轻松搭建与使用指南
- 2024-11-02Redis项目实战:新手入门教程
- 2024-10-22Redis入门教程:轻松掌握数据存储与操作
- 2024-10-22Redis缓存入门教程:快速掌握Redis缓存基础知识