Redis:缓存穿透、缓存雪崩和缓存击穿(未完待续)
Redis的缓存穿透、缓存雪崩和缓存击穿
- 一. 缓存穿透
- 1.1 概念
- 1.2 造成的问题
- 1.3 解决方案
- 1.4 案例:查询商铺信息(缓存穿透的实现)
- 二. 缓存雪崩
- 2.1 概念
- 2.2 解决方案
- 三. 缓存击穿(热点key)
- 3.1 概念
- 3.2 解决方案
- 3.3 案例:查询商铺信息(互斥锁和逻辑过期的实现)
- (1)互斥锁
- 补充:SETNX(setIfAbsent)
- (2)逻辑过期
一. 缓存穿透
1.1 概念
缓存模型;
定义:指客户请求的数据在缓存中和数据库中都不存在!这样缓存永远不会命中,请求都会发到数据库;
(穿透即穿透了缓存和数据库);

1.2 造成的问题
假设不断发送这样的请求,则会让数据库崩溃;
1.3 解决方案
(1)主动
- 增加请求参数的复杂度且有一定规范,对请求参数提前做校验;
- 加强用户权限校验,如用拦截器校验登录状态;
- 热点参数的限流
(2)被动
- 缓存空对象:
为了不再让请求造成缓存穿透,则产生一个null空值(value=””)到redis中,当下次再请求时就可以从Redis返回而不用去查数据库;
优点:简单
缺点:
①造成Redis中的内存消耗;----- 对这样的null值数据设置TTL有效时间;
②短期不一致:Redis中存了null值,但是数据库此时真的增加了这条数据,而缓存中数据和数据库不一样,当有用户来查询时会查到null数据;------ 缩短TTL时间 或者手动覆盖数据到Redis中;

- 布隆过滤
【在请求访问Redis之前】添加一个布隆过滤器;
布隆过滤器中存储的是byte字节数据,存储的是二进制位;
数据库中的数据会经过Hash算法,将计算后的值存到布隆过滤器,当请求发过来时,会判断请求的Hash值是否存在于过滤器中,若过滤器判断不存在则一定不存在;
若过滤器判断存在,则只是可能存在,不是100%准确,所以依然有一定缓存穿透风险的;
优点:内存占用少,只需要存Hash值,没有多余key
缺点:实现相对复杂;可能误判(哈希冲突);

1.4 案例:查询商铺信息(缓存穿透的实现)
业务逻辑:
1.注入stringRedisTemplate的bean,从Redis查询商户缓存,如果命中则判断是不是空值,不是则返回商铺信息,是则返回不存在;
2.未命中则查询数据库,若不存在,报错;
3.若数据库中存在,则用stringRedisTemplate.opsForVlaue将商铺信息更新到Redis中,并更新TTL有效时间(兜底)!
4.如果数据库中也不存在(缓存穿透),则将空值写入Redis,即value=“”;



效果:
发送id不存在的查询请求,查询Redis和数据库,缓存穿透了,返回“不存在”,会在Redis缓存一个空值;
假设再发送同样的请求,则查询到Redis中的空字符串数据,还是返回“不存在”,但是不走数据库了!

总结:1. 缓存穿透则写入空值 2. Redis命中时需要判断是否为空字符串;
二. 缓存雪崩
2.1 概念
定义:同一时段内有①大量的缓存Key同时失效过期 或者 ②Redis服务宕机,导致大量请求发往数据库,带来巨大压力;

2.2 解决方案
(1)针对大量缓存同时失效:
- 给不同的key的TTL添加随机值;
- 给缓存业务添加降级限流策略,牺牲部分服务,保护数据库;
(2)针对Redis宕机:
- 启用熔断机制暂停服务;
- 用主从节点的方式建立Redis高可用集群,哨兵机制 可以实现对服务的监控(类比Kafka),主从实现数据同步;
- 在多个层面建立缓存,让Nginx也做缓存,Nginx未命中,再去Redis,再去JVM,最后才是数据库
多级缓存在大型电商中如商品详情会使用,以应对亿级以上的并发;
三. 缓存击穿(热点key)
3.1 概念
定义:
业务通常会有几个数据会被 ①频繁访问,比如秒杀活动,且 ②缓存重建业务比较复杂,这类被频地访问的数据被称为 热点数据。
如果缓存中的某个热点数据过期了且缓存重建耗时较长,此时大量的请求线程都会去缓存重建,会对数据库带来巨大冲击;

3.2 解决方案
(1)互斥锁
所有请求都去尝试缓存重建,所以用互斥锁的方式只让一个请求线程去缓存重建;
只有获取到锁的请求线程才能去进行缓存重建;而其他请求线程则休眠一会再查询,直到锁释放后,再访问到新的缓存;
优点:保持数据的一致性
缺点:线程需要等待,性能不好(牺牲可用性)

(2)逻辑过期
- 缓存穿透的原因就是因为热点数据过期,所以设置一个
逻辑过期让热点数据在Redis中永不过期(不设置TTL);
新增一个过期时间的字段放到Value中,让线程可以判断是否逻辑过期;(类似MyBatisPlus的逻辑删除),但实际上不是TTL,这样每次都能命中; - 线程发现热点数据已经逻辑过期,就尝试获取互斥锁,
①如果获取锁成功,则再 开启一个新的线程 去缓存重建,原线程返回旧数据;
②获取失败则返回旧数据;
优点:线程不需要等待,性能好(保证可用性)
缺点:牺牲一致性

注意:
互斥锁方法和逻辑过期都用了互斥锁,前者当其他线程发现锁被占用后则会一直重试等待直到缓存重建完成;
后者当其他线程发现数据逻辑过期后才去尝试获取锁,锁被占用则获取旧的热点数据,而不会一直等待;
总结:互斥锁和逻辑过期都是在解决缓存重建时的并发问题; 互斥锁即让请求线程等待,保证一致性;逻辑过期是可以拿到旧数据即保证了可用性,但是牺牲了一致性。
3.3 案例:查询商铺信息(互斥锁和逻辑过期的实现)
(1)互斥锁
流程:
1.注入stringRedisTemplate的bean,从Redis查询商户缓存,如果命中返回商铺信息,
2.如果未命中则尝试获取锁,注意锁的key不是商铺id,
3.没有拿到锁则休眠一会,再重新尝试查询Redis(递归);
4.获取到锁则缓存重建,缓存重建需要去查询数据库,查完后更新Redis,释放锁;
5.返回结果;
先建立加锁和解锁两个方法:
为了防止锁永不释放,给锁加有效期(兜底)

业务逻辑:


测试:
使用JMeter模拟多线程并发的场景;
设置1000个线程,时间共5s,QPS=200/s;

结果:
Idea中显示只查询了一次数据库,成功;
补充:SETNX(setIfAbsent)
SETNX / setIfAbsent:(NX=not exist)即key不存在时才能set成功! 用来作 互斥锁 使用;
例:

即相当于是互斥锁,只有第一个能成功!后面的都失败了!
释放锁:

为了防止锁永远不被释放,一般加有效期(兜底):假设10秒,一般业务执行在1秒内;
(2)逻辑过期
相关文章:
Redis:缓存穿透、缓存雪崩和缓存击穿(未完待续)
Redis的缓存穿透、缓存雪崩和缓存击穿一. 缓存穿透1.1 概念1.2 造成的问题1.3 解决方案1.4 案例:查询商铺信息(缓存穿透的实现)二. 缓存雪崩2.1 概念2.2 解决方案三. 缓存击穿(热点key)3.1 概念3.2 解决方案3.3 案例&a…...
HIVE 基础(四)
目录 分桶(Bucket) 设定属性 定义分桶 案例 建表语句 表数据 上传到数据 创建分桶语句 加载数据 分桶抽样(Sampling) 随机抽样---整行数据 随机抽样---指定列 随机抽样---百分比 随机抽样---抽取行数 Hive视图&#…...
整型在内存中的存储(详细剖析大小端)——“C”
各位CSDN的uu们你们好呀,今天小雅兰的内容是整型在内存中的存储噢,现在,就让我们进入整型在内存中的存储的世界吧 数据类型详细介绍 整型在内存中的存储:原码、反码、补码 大小端字节序介绍及判断 数据类型介绍 前面我们已经学…...
PS_高低频和中性灰——双曲线
高低频 高低频磨皮:把皮肤分成两个图层,一层是纹理层也就是皮肤的毛孔。 一层是皮肤光滑层没有皮肤细节。 高频”图层为细节层,我们用图章工具修高频 “低频”图层为颜色层,我们用混合画笔修低频 原理:修颜色亮度光影…...
Vim 命令速查表
Vim 命令速查表 简介:Vim 命令速查表,注释化 vimrc 配置文件,经典 Vim 键盘图,实用 Vim 书籍,Markdown 格式,目录化检索,系统化学习,快速熟悉使用! Vim 官网 | Vim | Vim…...
Java重要基本概念理解
熟悉JVM反射机制。 (1)反射的定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Ja…...
逆向工具之 unidbg 执行 so
1、unidbg 入门 unidbg 是一款基于 unicorn 和 dynarmic 的逆向工具, 可以直接调用 Android 和 IOS 的 so 文件,无论是黑盒调用 so 层算法,还是白盒 trace 输出 so 层寄存器值变化都是一把利器~ 尤其是动态 trace 方面堪比 ida tr…...
zk-STARK/zk-SNARK中IP,PCP,IPCP,IOP,PIOP,LIP,LPCP模型介绍
我们的目标是构造 zkSNARK。在我们的目标场景中,Prover 只需要发送一个简短的证明字符串给 Verifier,而 Verifier 不需要给 Prover 发送任何消息。 直接构造一个满足这个场景的 zkSNARK 可能会很困难。一个更灵活的方式是在先在理想模型下构造证明系统&…...
StreamAPI
StreamAPI 最近开发用上了 Java8的StreamAPI,(咋现在才用?嗯哼,项目需要)自己也不怎么会,来总结一波吧! 别认为好抽象!!!干他就完事 一.StreamAPI介绍 就是用来处理集合的数据 其实到后面会发现和SQL的语句是差不多的~哈哈?你不信?往下面看 Stream:英文翻译叫做流 举个粟子…...
MySQl高可用集群搭建(MGR + ProxySQL + Keepalived)
前言 服务器规划(CentOS7.x) IP地址主机名部署角色192.168.x.101mysql01mysql192.168.x.102mysql02mysql192.168.x.103mysql03mysql192.168.x.104proxysql01proxysql、keepalived192.168.x.105proxysql02proxysql、keepalived 将安装包 mysql_cluster_…...
java+Selenium+TestNg搭建自动化测试架构(3)实现POM(page+Object+modal)
1.Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例的可维护性。 PageObject设计…...
oracle11g忘记system密码,重置密码
OPW-00001: 无法打开口令文件 cmd.exe 使用管理员身份登录 找到xxx\product\11.2.0\dbhome_1\database\PWDorcl.ora文件,删除 执行orapwd fileD:\app\product\11.2.0\dbhome_1\database\PWDorcl.ora passwordtiger (orapwd 在\product\11.2.0\dbhome_1\BIN目录下…...
黑马 Vue 快速入门 笔记
黑马 Vue 快速入门 笔记0 VUE相关了解0.1 概述0.2 MVVM0.3 JavaScript框架0.4 七大属性0.5 el:挂载点1 VUE基础1.0 第一个vue代码:Hello,vue1.1 v-bind 设置元素的属性 简写 :1.2 v-if , v-else , v-else-ifv-if , v-e…...
HTTP协议知识体系核心重点梳理
HTTP协议知识体系核心重点梳理TCP/IP协议1.四层模型2.通信过程3.tcp三次握手和四次挥手4.tcp安全传输4. 一次HTTP通信流程HTTP协议HTTP/1.1CookieHttp报文格式内容编码分块传输编码HTTP状态码重定向状态码常用的通用首部cache-controlExpiresConnectionTransfer-Encoding常用的…...
Nginx优化与防盗链
Nginx优化与防盗链 📒博客主页: 微笑的段嘉许博客主页 💻微信公众号:微笑的段嘉许 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由微笑的段嘉许原创! Ὄ…...
自动驾驶路径规划概况
文章目录前言介绍1. 路径规划在自动驾驶系统架构中的位置2. 全局路径规划的分类2.1 基础图搜索算法2.1.1 Dijkstra算法2.1.2 双向搜索算法2.1.3 Floyd算法2.2 启发式算法2.2.1 A*算法2.2.2 D*算法2.3 基于概率采样的算法2.3.1 概率路线图(PRM)2.3.2 快速…...
某某银行行面试题目汇总--HashMap为什么要扩容
一、HashMap啥时候扩容,为什么扩容? HashMap的默认大小是16。在实际开发过程中,我们需要去存储的数据量往往是大于存储容器的默认大小的。所以,出现容量默认大小不能满足需求时,就需要扩容。而这个扩容的动作是由集合自…...
求职者:“我有五年测试经验”面试官: “不,你只是把一年的工作经验用了五年”
最近看到很多软件测试由于公司裁员而需要重新求职的。他们普遍具有4年甚至更长的工作经验。但求职结果往往都不太理想。 我在与部分软件测试求职者交谈的过程中发现,很多人的工作思路不清晰,技能不扎实,没有持续学习的习惯,但对于…...
Nacos配置中心
什么是配置中心所谓配置中心:在微服务的环境下,将项目需要的配置信息保存在配置中心,需要读取时直接从配置中心读取,方便配置管理的微服务工具我们可以将部分yml文件的内容保存在配置中心一个微服务项目有很多子模块,这些子模块可能在不同的服务器上,如果有一些统一的修改,我们…...
【故障】6、yum不可用
文章目录[toc]一、yum命令不能使用1)报错2)问题分析3)完全删除python及yum重新安装1、删除python2、删除yum3、下载Python依赖rpm包4、下载yum依赖rpm包5、强制安装python6、强制安装yum7、测试一、yum命令不能使用 1)报错 Ther…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
