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…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
