Redis中缓存穿透、缓存击穿、缓存雪崩的详解

如何理解Redis缓存的穿透、击穿、雪崩问题:

缓存穿透

是指缓存中和数据库中都没有数据,而用户不断访问,导致这个不存在的数据每次请求都要到存储层去查询,这样失去了意义。

缓存穿透的解决方案有哪些?

  • 缓存null值
  • 布隆过滤
  • 增强id的复杂度,避免被猜测id规律
  • 做好数据的基础格式校验
  • 加强用户权限校验
  • 做好热点参数的限流

讲一讲布隆过滤

布隆过滤器的特点:

容器角度:

  • 如果布隆过滤器判断结果为元素存在,那么该元素实际上元素不一定会存在,由于哈希碰撞,所以会存在一定误判率。
  • 如果布隆过滤器判断结果为元素不存在,那么他就一定不存在,因为无论哈希碰撞啥的,只要该元素计算出下标值对应数组元素值为0,那么该元素就必定不存在。
  • 布隆过滤器是不支持删除元素的,因为如果位图的某个位被多个元素占用着,那么如果删除其中一个元素是否能将该位置0能,置0的话会影响到其他元素,不置0就等于没删除。

元素角度:

  • 如果元素实际不存在,布隆过滤器可能判断存在。
  • 如果元素实际存在,布隆过滤器一定判断存在。

利用第二个特性,我们就能解决持续从数据库查询不存在的值的问题,把要查询的值先过布隆过滤器,判断是否存在,存在就走redis缓存,不存在就直接返回,并且配合缓存空值,可以有效解决缓存穿透问题,虽然存在一定误差,但是在业务范围内允许接受。

  • 第一步先查询数据库数据并加入到布隆过滤器中。
  • 请求发送过来布隆过滤器判断是否命中,命中就走缓存,之后接着看是否走数据库还是直接从缓存获取返回。
  • 如果布隆过滤器miss,就直接返回,不走cache了。

缓存击穿

是缓存中没有数据,而数据库中有数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大。

|------|----------------------------|---------------------------|
| 解决方案 | 优点 | 缺点 |
| 互斥锁 | * 没有额外的内存消耗 * 保证一致性 * 实现简单 | * 线程需要等待,性能受影响 * 可能有死锁风险 |
| 逻辑过期 | * 线程无需等待。性能较好 | * 不保证一致性 * 有额外内存消耗 * 实现复杂 |

缓存雪崩

就是同一时间内,大量的缓存key值同时失效或者redis服务器宕机,导致大量的请求到达数据库,带来巨大的压力

解决方案

​​​​​​​

1. 合理设置缓存过期时间

  • 避免大量缓存数据同时过期,可以设置缓存的过期时间为随机值,或者在缓存集中到期之前提前对热点数据进行预热,将热点数据提前加载到缓存中。

2. 使用多级缓存

  • 将缓存数据分散到不同的缓存节点或缓存服务器中,以减少缓存集中到期的风险。可以结合本地缓存、分布式缓存等方式来实现多级缓存。

3. 限流和熔断

  • 对请求进行限流处理,避免大量请求同时涌入数据库。可以使用限流算法(如令牌桶、漏桶算法)对请求进行限制。同时,可以设置熔断机制,在检测到系统异常时暂时屏蔽部分请求,以保护数据库免受过载。

4. 数据库优化

  • 提高数据库的处理能力和稳定性,可以采用数据库集群、读写分离、垂直拆分等方式来优化数据库架构,提高数据库的负载能力。
相关推荐
墨染点香10 分钟前
LeetCode Hot100【6. Z 字形变换】
java·算法·leetcode
ldj202033 分钟前
SpringBoot为什么使用new RuntimeException() 来获取调用栈?
java·spring boot·后端
超龄超能程序猿34 分钟前
Spring 应用中 Swagger 2.0 迁移 OpenAPI 3.0 详解:配置、注解与实践
java·spring boot·后端·spring·spring cloud
风象南1 小时前
SpringBoot配置属性热更新的轻量级实现
java·spring boot·后端
洛阳泰山1 小时前
Spring Boot 整合 Nacos 实战教程:服务注册发现与配置中心详解
java·spring boot·后端·nacos
Y4090011 小时前
C语言转Java语言,相同与相异之处
java·c语言·开发语言·笔记
YuTaoShao1 小时前
【LeetCode 热题 100】994. 腐烂的橘子——BFS
java·linux·算法·leetcode·宽度优先
布朗克1681 小时前
java常见的jvm内存分析工具
java·jvm·数据库
都叫我大帅哥2 小时前
深入浅出 Resilience4j:Java 微服务的“免疫系统”实战指南
java·spring cloud
Cao_Shixin攻城狮4 小时前
Flutter运行Android项目时显示java版本不兼容(Unsupported class file major version 65)的处理
android·java·flutter