谈一谈缓存穿透,击穿,雪崩
缓存穿透
缓存穿透是指在使用缓存系统时,频繁查询一个不存在于缓存中的数据,导致这个查询每次都要通过缓存层去查询数据源,无法从缓存中获得结果。这种情况下,大量的请求会直接穿透缓存层,直接访问数据源,从而增加了系统的负载,降低了系统的性能。
通常情况下,当一个查询发现所需数据不存在于缓存中时,它会从数据源中获取数据,并将数据存储到缓存中,以便后续查询可以直接从缓存中获取数据。然而,当不断查询不存在于缓存中的数据时,缓存层会无法起到预期的性能提升作用,因为每次查询都必须去访问数据源。
缓存穿透可能由恶意攻击、系统设计问题或数据变更等原因引起。为了防止缓存穿透,可以在缓存层添加缓存不存在的数据的标记,当查询到缓存中有这个标记时,可以避免不必要的访问数据源,从而提高系统的性能。另外,使用布隆过滤器等技术可以对查询进行预处理,过滤掉一些明显不存在的查询,进一步减轻系统压力。
缓存击穿
缓存击穿是指当一个热点数据在缓存中过期或被删除时,同时有大量的并发请求访问该数据,导致这些请求都无法从缓存中获取到数据,而需要直接从数据源中获取。这种情况下,大量的请求会直接访问数据源,给数据源带来很大的压力,可能导致数据源崩溃或性能下降。
在正常情况下,缓存会存储常用的数据,以提高系统的性能和响应速度。当一个查询发现所需的数据不存在于缓存中时,它会从数据源中获取数据,并将数据存储到缓存中,以便后续查询可以直接从缓存中获取数据。然而,当一个热点数据在某一时刻过期或被删除时,大量的请求会同时涌入,这些请求无法从缓存中获取数据,导致缓存层无法起到预期的性能提升作用。
为了防止缓存击穿,可以采取以下策略:
-
设置合适的缓存过期时间:确保缓存数据在合适的时间内过期,避免在同一时间大量数据过期导致缓存击穿。
-
使用互斥锁或分布式锁:当缓存过期时,使用锁机制保证只有一个请求可以从数据源中获取数据,其他请求等待获取到数据后再从缓存中获取。
-
预加载热点数据:在系统启动或数据源更新时,提前加载热点数据到缓存中,避免在热点数据过期时出现缓存击穿。
-
使用高可用的缓存方案:使用多级缓存或分布式缓存系统,确保缓存的高可用性,避免单点故障导致缓存击穿。
缓存雪崩
缓存雪崩指的是当缓存系统中的大量数据同时失效或过期,导致大量的请求直接访问数据源,给数据源和系统带来巨大的压力,从而导致系统性能下降甚至崩溃。
正常情况下,缓存系统会设置合理的过期时间,以使被缓存的数据在一段时间内有效。当一个查询发现所需数据不存在于缓存中时,它会从数据源中获取数据,并将数据存储到缓存中,以便后续查询可以直接从缓存中获取数据。
然而,当大量的缓存数据在同一时间失效或过期时,如果没有有效的缓存更新机制,系统中的请求就会直接访问数据源。由于大量请求同时涌入数据源,可能会导致数据源的性能下降、响应时间延长甚至崩溃。这种情况下,系统会经历一段时间的高负载压力,如同雪崩一般,被称为缓存雪崩。
为了避免缓存雪崩,可以采取以下策略:
-
合理设置缓存的过期时间:缓存过期时间应随机分散,避免大量缓存在同一时间失效。
-
使用缓存的自动过期机制:例如,使用Redis的过期机制,设置缓存的过期时间,并自动更新缓存,避免过期数据的同时失效。
-
设置热点数据的永久缓存或手动刷新机制:重要的热点数据可以设置为永久缓存,或者手动进行缓存更新,避免热点数据过期导致缓存雪崩。
-
引入多级缓存:使用多级缓存,例如将热点数据存储在内存缓存中,冷数据存储在持久化缓存或数据库中,以降低缓存雪崩的风险。
-
监控和预警机制:监控缓存系统的状态和性能,设置预警机制,在发现异常情况时及时采取措施,避免缓存雪崩的发生。
文末小叙:
对于这些内容,就没有那么简单易懂,而且也没有代码辅助,属于纯理论,但是真实的开发中,我们会涉及这些问题,所以还是需要注意一下,不能单纯为了面试,因为最终的结果我们还是需要落实开发!
相关文章:

谈一谈缓存穿透,击穿,雪崩
缓存穿透 缓存穿透是指在使用缓存系统时,频繁查询一个不存在于缓存中的数据,导致这个查询每次都要通过缓存层去查询数据源,无法从缓存中获得结果。这种情况下,大量的请求会直接穿透缓存层,直接访问数据源,…...

如何对反编译的安卓应用进行调试并修改
安卓修改大师可以在没有源代码的情况下,直接反编译已经打包的APK安装包,通过修改SMALI代码实现添加和去除部分功能,并在应用的任何地方添加任意代码,增加任意任何您想实现的功能。通过这种方式,把该应用变为您自己的应…...

C#实现数据库数据变化监测(sqlservermysql)
监测数据库表数据变化,可实现数据库同步(一主一从(双机备份),一主多从(总部数据库,工厂1,工厂2,工厂数据合并到总部数据)) sqlserver 启用数据库…...
MFC第二十三天 HBrush对闭合图形的填充、CPen、CFont类常用功能与LOGFONT和LOGPEN结构体
文章目录 HBrush对闭合图形的填充HBITMAP位图资源的加载和平铺填充CFont类常用功能与LOGFONT结构体CPen类简介 HBrush对闭合图形的填充 HBRUSH创建: a)实色填充: HBRUSH CreateSolidBrush( COLORREF color);b)栅格线填充: HBRUSH CreateHa…...

深入学习 Redis - 渐进式遍历 scan 命令、数据库管理命令
目录 前言 一、scan 命令 二、数据库管理命令 select dbsize flushdb / flushall 前言 之前我们所了解到的 keys * 是一次性把整个 redis 中所有的 key 都获取到,但是整个操作比较危险,可能会一下子的都太多的 key,阻塞 redis 服务器. …...

python+opencv实现显示摄像头,截取相关图片,录取相关视频
实时显示摄像头图像 按下空格键,截取图片 按下tab键,开始录制摄像内容,再次按下,结束录制 按下Esc键,关闭窗口 import cv2 import numpy#第几章图片 img_count0InitVideoFalse #第几个视频 video_count0 video_flagFa…...

第十章:重新审视扩张卷积:一种用于弱监督和半监督语义分割的简单方法
0.摘要 尽管取得了显著的进展,弱监督分割方法仍然不如完全监督方法。我们观察到性能差距主要来自于它们在从图像级别监督中学习生成高质量的密集目标定位图的能力有限。为了缓解这样的差距,我们重新审视了扩张卷积[1]并揭示了它如何以一种新颖的方式被用…...

指令收集:DOCKER+K8S
docker 1.镜像指令:docker images 1、docker images : 列出本地主机上的镜像OPTION字段说明: -a 列出所有本地镜像, -q 只显示镜像ID2、docker search 某个镜像名字 : 查找某个镜像加上 --limit 5 redisÿ…...

Minecraft 1.20.x Forge模组开发 05.矿石生成
我们本次尝试在主世界生成模组中自定义的矿石 效果演示 效果演示 效果演示 1.由于1.20的版本出现了深板岩层的矿石,我们要在BlockInit类中声明一个矿石的两种岩层形态: BlockInit.java package com.joy187.re8joymod.init;import java.util.function.Function;import java…...
运维面试大全
文章目录 第一阶段你是用过哪些Linux命令Linux 系统安全优化与内核优化经常使用shell脚本做什么软连接与硬链接的区别怎么查看文件IOS七层模型三次握手与四次挥手lvm 逻辑卷创建过程磁盘配额raid 磁盘阵列文本三剑客防火墙iptables与firewardLinux系统资源查询命令日志的八大等…...

【线程安全的讨论(一)】CPU多核缓存架构和JMM
CPU多核缓存架构 一、CPU多核缓存架构可见性问题乱序执行(指令重排) 二、JMM——Java内存模型 一、CPU多核缓存架构 计算机的基本组成图 CPU 缓存为了提高程序运行的性能,现代 CPU 在很多方面会对程序进行优化。CPU 的处理速度很快…...

以太网交换机的生成树协议STP
概述 网络环路带来的问题 广播风暴 广播帧在各个交换机之间反复转发,分别按顺时针和逆时针方向不停的同时兜圈。广播风暴会大量消耗网络资源,使得网络无法正常转发其他数据帧。 主机收到反复的广播帧,会大量消耗主机的资源。交换机的帧交换…...

手机照片转换成pdf怎么做?了解这几种方法就可以了
手机照片转换成pdf怎么做?转换照片为PDF的需求在日常生活中很常见。无论是收集有关旅行、家庭或工作的照片,将它们组织成一个PDF文件可以更方便地分享给朋友或同事。那么下面就给大家分享几个手机照片转换成pdf的方法。 虽然有多种软件和工具可以将照片转…...

跨境电商还有人在做吗,这十大选品技巧建议收藏!
随着电商的快速发展,无论国内或者国外电商,竞争都比较激烈,很多人觉得现在入行太晚了,玩不过那些老卖家。 不过我想说的是:做电商很重要的一点就是选品,那些很早一批老卖家可能也是借着红利期走过来的&…...

HTML快速学习
目录 一、网页元素属性 1.全局属性 2.标签 2.1其他标签 2.2表单标签 2.3图像标签 2.4列表标签 2.5表格标签 2.6文本标签 二、编码 1.字符的数字表示法 2.字符的实体表示法 三、实践一下 一、网页元素属性 1.全局属性 id属性是元素在网页内的唯一标识符。 class…...

centos7搭建k8s环境并部署springboot项目
之前看了很多文章,都是部署后一直报错,百度解决后下次又忘了,这次决定把从头到尾的过程记录下来方便下次再看,部署参考文章尚硅谷Kubernetes(k8s)视频学习笔记_尚硅谷k8s笔记_溯光旅者的博客-CSDN博客 1、…...
nuitka打包软件程序
将python代码打包成exe桌面程序 1、打包参数含义 """-–mingw64 默认为已经安装的visio stdio去编译-–standalone 独立环境,这是必须的(否则拷给别人无法使用)-–windows-disable-console 没有CMD控制窗口-–output-dirout 生成exe到out文件夹下面…...

12-3_Qt 5.9 C++开发指南_创建和使用静态链接库
第12章中的静态链接库和动态链接库介绍,都是以UI操作的方式进行,真正在实践中,可以参考UI操作产生的代码来实现同样的功能。 文章目录 1. 创建静态链接库1.1 创建静态链接库过程1.2 静态链接库代码1.2.1 静态链接库可视化UI设计框架1.2.2 qw…...
conda模式安装paddlepaddle2.4.2版本
conda模式安装paddlepaddle2.4.2版本 一、下载anaconda 2022.10 window-x86-x64.exe 清华镜像源Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror,进去后根据自己的需要选择对应的版本下载 下载安装到磁盘空闲空间要大的D:\Pr…...
英语疑问句
文章目录 一般疑问句特殊疑问句 一般疑问句 英语肯定句怎么改成一般疑问句? 1.假如句子中有"情态动词、助动词、be动词"则直接提前。2.假如句子,只有实义动词,就要借助"do,does,did"放在句子前面,并将实义动词改为"…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...