【Redis】缓存的穿透、击穿和雪崩

引言

要了解缓存的这几个相关问题,我们先以一个例子来引入:

有一个get请求:

复制代码
api/news/getById/1

正常情况下对其申请访问的流程如图:

但若是如此,访问增多或者受到攻击时很容易受到以下问题

1 缓存穿透

1.1 造成原因

当查询一个不存在的数据时,MySQL查询不到数据,也不会直接写入缓存,导致每次请求都会查询数据库

1.2 解决方案

1.2.1 方案一 缓存空数据

缓存空数据,查询返回的数据为空,仍将该结果保存,也就是保存null数据
优点:简单

缺点:消耗内存,且当数据库中的数据更新后,可能使得缓存与数据库中的数据不一致

1.2.2 方案二 布隆过滤器

先解释一个概念:bitmap(位图)

bitmap相当于一个以bit为单位组成的数组,每个单元只能存储二进制数0或1

布隆过滤器作用:检索一个元素是否在一个集合中

比如:

但是当数组大小有限时,就会出现类似哈希冲突的问题:

此时可以发现,如果id为3的数据不存在时,用布隆过滤器时会造成误判

可以得出,数组越大,布隆过滤器误差越小,但同时带来更多的内存消耗

如何调整其误判率呢?

可以通过Redisson或者Guava来设置误判率,通常将误判率设置在5%以下

2 缓存击穿

2.1 造成原因

给某个key设置了过期时间,当该key过期时,恰好对其有大量并发请求,这些并发请求可能瞬间将数据库压垮

2.2 解决方案

2.2.1 方案一 互斥锁

特点:数据强一致性能差,可在银行系统中使用

2.2.2 方案二 逻辑过期

特点高可用,但不能保证数据完全一致

性能优,可在秒杀功能中使用

3 缓存雪崩

3.1 造成原因

同一时段大量key同时失效或Reids服务器宕机,导致大量请求到达数据库,给数据库带来巨大压力

3.2 解决方案

1.给不同key的TTL添加随机值

2.利用Redis集群提高服务可用性,如哨兵模式和集群模式

3.给缓存业务添加降级限流策略,如nginx或spring cloud gateway

4.给业务添加多级缓存,如Guava或Caffeine
给缓存业务添加降级限流策略可作为保底策略,穿透、击穿、雪崩均适用

相关推荐
Macbethad11 小时前
基于WPF与.NET的洁净厂房数据孪生平台技术方案:架构、实现与SEMI标准实践
数据库·系统架构
咏方舟【长江支流】11 小时前
【开源】跨语言·跨平台·跨数据库(6) ——一种ORM缓存的接口实现和容错处理
数据库·缓存·开源·咏方舟-长江支流·用宝框架
努力进修11 小时前
破除工业 AI 业务落地壁垒:多模时序融合架构重塑设备全维度数据价值
数据库·人工智能·架构
静水楼台x11 小时前
spring security
java·数据库·spring
深度研习笔记12 小时前
OpenCV工业视觉进阶14|SQLite违规数据库存储+历史记录查询+Excel报表导出,完成项目商用数据闭环(验收必备)
数据库·opencv·sqlite
要开心吖ZSH14 小时前
一文搞懂:JDK 21 虚拟线程 vs N种异步方案,到底该怎么选?
java·数据库·jdk·虚拟线程
guodingdingh19 小时前
软件开发工作问题总结0718
java·开发语言·数据库
GuWenyue20 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
前端·数据库·人工智能
Miao121311 天前
某海外住宿平台如何在大规模场景下实现指标一致性:Minerva 指标平台实践
大数据·数据库·人工智能
CodexDave1 天前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡