当前位置: 首页 > news >正文

【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

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

http://www.xdnf.cn/news/1479151.html

相关文章:

  • 一个正常的 CSDN 博客账号,需要做哪些基础准备?
  • C++基础知识
  • 《sklearn机器学习——聚类性能指标》Silhouette 系数
  • 用 Hashcat 提取哈希值并找回遗忘的密码:一次实用的尝试
  • 【Big Data】Apache Kafka 分布式流处理平台的实时处理实践与洞察
  • uniapp基础组件概述
  • SPI 三剑客:Java、Spring、Dubbo SPI 深度解析与实践​
  • 【开题答辩全过程】以电商数据可视化系统为例,包含答辩的问题和答案
  • 编辑shell脚本示例练习
  • 《sklearn机器学习——聚类性能指标》Davies-Bouldin Index (戴维斯-博尔丁指数)
  • Linux 96 shell:expect { }
  • 车载通信架构 --- DoIP企业规范中细节有哪些?
  • Huawei C 安全函数库
  • LabVIEW无线预警喷淋系统
  • 问题:指令译码前控制信号还没有产生,那么如何控制译码前指令的动作呢?
  • NV308NV309美光固态闪存NW388NW504
  • Docker部署搜索引擎SearXNG
  • (算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
  • 《云原生故障诊疗指南:从假活到配置漂移的根治方案》
  • Spark 中spark.implicits._ 中的 toDF和DataFrame 类本身的 toDF 方法
  • 【51单片机】【protues仿真】基于51单片机PM2.5空气质量检测系统
  • 云手机在企业办公中的作用
  • [论文阅读] 软件工程 - 需求工程 | 2012-2019年移动应用需求工程研究趋势:需求分析成焦点,数据源却藏着大问题?
  • Linux内核网络子系统框架介绍
  • STM32----W25QXX
  • Long-VLA:释放机器人长范围操作视觉-语言-动作模型的能力
  • 【HEMCO Reference Guide 参考指南第二期】配置文件的结构和语法
  • 贪心算法应用:3D打印支撑结构问题详解
  • 大语言模型预训练数据采集与清洗技术实践:从语料到知识库的全流程优化
  • Qt对话框与文件操作学习