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

谈一谈缓存穿透,击穿,雪崩

在这里插入图片描述

缓存穿透

缓存穿透是指在使用缓存系统时,频繁查询一个不存在于缓存中的数据,导致这个查询每次都要通过缓存层去查询数据源,无法从缓存中获得结果。这种情况下,大量的请求会直接穿透缓存层,直接访问数据源,从而增加了系统的负载,降低了系统的性能。

通常情况下,当一个查询发现所需数据不存在于缓存中时,它会从数据源中获取数据,并将数据存储到缓存中,以便后续查询可以直接从缓存中获取数据。然而,当不断查询不存在于缓存中的数据时,缓存层会无法起到预期的性能提升作用,因为每次查询都必须去访问数据源。

缓存穿透可能由恶意攻击、系统设计问题或数据变更等原因引起。为了防止缓存穿透,可以在缓存层添加缓存不存在的数据的标记,当查询到缓存中有这个标记时,可以避免不必要的访问数据源,从而提高系统的性能。另外,使用布隆过滤器等技术可以对查询进行预处理,过滤掉一些明显不存在的查询,进一步减轻系统压力。

缓存击穿

缓存击穿是指当一个热点数据在缓存中过期或被删除时,同时有大量的并发请求访问该数据,导致这些请求都无法从缓存中获取到数据,而需要直接从数据源中获取。这种情况下,大量的请求会直接访问数据源,给数据源带来很大的压力,可能导致数据源崩溃或性能下降。

在正常情况下,缓存会存储常用的数据,以提高系统的性能和响应速度。当一个查询发现所需的数据不存在于缓存中时,它会从数据源中获取数据,并将数据存储到缓存中,以便后续查询可以直接从缓存中获取数据。然而,当一个热点数据在某一时刻过期或被删除时,大量的请求会同时涌入,这些请求无法从缓存中获取数据,导致缓存层无法起到预期的性能提升作用。

为了防止缓存击穿,可以采取以下策略:

  1. 设置合适的缓存过期时间:确保缓存数据在合适的时间内过期,避免在同一时间大量数据过期导致缓存击穿。

  2. 使用互斥锁或分布式锁:当缓存过期时,使用锁机制保证只有一个请求可以从数据源中获取数据,其他请求等待获取到数据后再从缓存中获取。

  3. 预加载热点数据:在系统启动或数据源更新时,提前加载热点数据到缓存中,避免在热点数据过期时出现缓存击穿。

  4. 使用高可用的缓存方案:使用多级缓存或分布式缓存系统,确保缓存的高可用性,避免单点故障导致缓存击穿。

缓存雪崩

缓存雪崩指的是当缓存系统中的大量数据同时失效或过期,导致大量的请求直接访问数据源,给数据源和系统带来巨大的压力,从而导致系统性能下降甚至崩溃。

正常情况下,缓存系统会设置合理的过期时间,以使被缓存的数据在一段时间内有效。当一个查询发现所需数据不存在于缓存中时,它会从数据源中获取数据,并将数据存储到缓存中,以便后续查询可以直接从缓存中获取数据。

然而,当大量的缓存数据在同一时间失效或过期时,如果没有有效的缓存更新机制,系统中的请求就会直接访问数据源。由于大量请求同时涌入数据源,可能会导致数据源的性能下降、响应时间延长甚至崩溃。这种情况下,系统会经历一段时间的高负载压力,如同雪崩一般,被称为缓存雪崩。

为了避免缓存雪崩,可以采取以下策略:

  1. 合理设置缓存的过期时间:缓存过期时间应随机分散,避免大量缓存在同一时间失效。

  2. 使用缓存的自动过期机制:例如,使用Redis的过期机制,设置缓存的过期时间,并自动更新缓存,避免过期数据的同时失效。

  3. 设置热点数据的永久缓存或手动刷新机制:重要的热点数据可以设置为永久缓存,或者手动进行缓存更新,避免热点数据过期导致缓存雪崩。

  4. 引入多级缓存:使用多级缓存,例如将热点数据存储在内存缓存中,冷数据存储在持久化缓存或数据库中,以降低缓存雪崩的风险。

  5. 监控和预警机制:监控缓存系统的状态和性能,设置预警机制,在发现异常情况时及时采取措施,避免缓存雪崩的发生。

文末小叙:
对于这些内容,就没有那么简单易懂,而且也没有代码辅助,属于纯理论,但是真实的开发中,我们会涉及这些问题,所以还是需要注意一下,不能单纯为了面试,因为最终的结果我们还是需要落实开发!

http://www.lryc.cn/news/103451.html

相关文章:

  • 如何对反编译的安卓应用进行调试并修改
  • C#实现数据库数据变化监测(sqlservermysql)
  • MFC第二十三天 HBrush对闭合图形的填充、CPen、CFont类常用功能与LOGFONT和LOGPEN结构体
  • 深入学习 Redis - 渐进式遍历 scan 命令、数据库管理命令
  • python+opencv实现显示摄像头,截取相关图片,录取相关视频
  • 第十章:重新审视扩张卷积:一种用于弱监督和半监督语义分割的简单方法
  • 指令收集:DOCKER+K8S
  • Minecraft 1.20.x Forge模组开发 05.矿石生成
  • 运维面试大全
  • 【线程安全的讨论(一)】CPU多核缓存架构和JMM
  • 以太网交换机的生成树协议STP
  • 手机照片转换成pdf怎么做?了解这几种方法就可以了
  • 跨境电商还有人在做吗,这十大选品技巧建议收藏!
  • HTML快速学习
  • centos7搭建k8s环境并部署springboot项目
  • nuitka打包软件程序
  • 12-3_Qt 5.9 C++开发指南_创建和使用静态链接库
  • conda模式安装paddlepaddle2.4.2版本
  • 英语疑问句
  • k8s证书更新,kubeadm安装的K8S证书过期后无法使用后证书更新方法
  • java实现日期拆分的方法
  • Ansible之playbook剧本编写
  • 【ChatGPT辅助学Rust | 基础系列 | Hello, Rust】编写并运行第一个Rust程序
  • 自监督去噪:Noise2Noise原理及实现(Pytorch)
  • BES2700 SDK绝对时间获取方法
  • Closure Table-树形多级关系数据库设计(MySql)
  • 【SQL应知应会】表分区(一)• MySQL版
  • java语法基础-- 变量、标识符、关键字
  • [STL]stack和queue模拟实现
  • 汽车销售企业消费税,增值税高怎么合理解决?