Redis - 三大缓存问题(穿透、击穿、雪崩)

news2024/11/17 7:31:19

缓存穿透

概念: 查询一个数据库中也不存在的数据,数据库查询不到数据也就不会写入缓存,就会导致一直查询数据库

解决方法:

1. 缓存空数据

如果数据库也查询不到,就把空结果进行缓存

缺点是 - 消耗内存

2. 使用布隆过滤器

布隆过滤器的作用 :检索一个元素是否在某个集合中

布隆过滤器由组成 : 位图 + 若干哈希函数

位图: 一个以 bit (位) 为单位的数组,数组中的每个单位只能存储二进制数 0 或 1 ,并且在初始状态下都为 1

比如数据库中有个 id=1 的数据,布隆过滤器会通过三个哈希函数分别计算出其哈希值为 1 、3 、7 ,将这三个位置的值置为 1
在这里插入图片描述
接着依次将数据库中的其他数据按照该方法写入布隆过滤器

如果此时请求查询 id = -1,根据那三个哈希函数计算得到的哈希值为 1 、 3 、 14 ,并且位图中 14 位置的值为0, 那么我们就可以肯定这个数据在MySQL中不存在

但如果 计算出来的值是 1 、 3 、 14 ,且这三个位置的值都为 1,那也不能确定 id=-1 的数据在数据库中存在,比如以下情况
在这里插入图片描述
1 、 3 、 14 三个位置的值都为 1 ,并不是因为 id=-1 的数据存在,而是恰巧 id=1 和 id=2 的存在使得 1 、 3 、 14 三个位置的值都为 1

我们可以想到,数组越小,误判的概率就越大,上面的位图只是做演示,实际上的位图长度非常长

在 Java 中提供了具体的实现方案 Redisson 和 Guava

布隆过滤器的预热 和 缓存的预热是在同一时刻进行的,之后的请求都会先打到布隆过滤器上,如果布隆过滤器判断该数据不存在直接返回,如果判断存在再放行查询缓存

缓存击穿

*概念:*一个非常热点的key在扛着大并发,当这个key过期的时候,持续的大并发就穿破缓存,直接打到数据库上,把数据库压垮

解决方法:

添加互斥锁(分布式锁)

在这里插入图片描述
当 线程1 查询缓存未命中时,添加一个互斥锁,接着查询数据库重建缓存,重建缓存的过程中,又来个 线程2 ,线程2 也不会命中缓存,那么 线程2 会尝试获取互斥锁,但是失败(因为此时被线程1持有),线程2 会休眠一会儿重试,直到 线程1 重建缓存成功,线程2 N次尝试后命中缓存

实例代码如下:
在这里插入图片描述

逻辑过期

概念: 对热点数据不设置过期时间,我们在写缓存的时候添加一个过期时间字段

其执行过程如下

在这里插入图片描述
线程1 查询缓存,发现数据已经逻辑过期,则获取互斥锁,并创建子线程 线程2 去重建缓存,然后直接返回过期的数据,在 线程2 重建缓存的过程中,又来个 线程3 发现缓存也过期了,而获取互斥锁失败,同样直接返回过期数据

两种方法的比较:

  • 互斥锁 – 能保证数据的强一致性 但是 性能较差
  • 逻辑过期 – 优先保证高可用,但是数据一致性较差

现实开发过程中,要根据不同的业务场景进行选择,如果业务中设计金钱交易,一般要保证高可用,选择互斥锁,而在互联网的场景中,更加注重用户体验的场景,首选逻辑过期方案

缓存雪崩

概念: 在同一个时段内,有大量的key同时失效 或者 Redis服务器宕机,导致大量请求到达服务器,带来巨大压力

解决方法:

如果是有大量的key同时失效 – 给不同的key的过期时间添加随机值

如果是Redis服务器宕机 – 搭建Redis高可用集群

兜底方案 – 给缓存业务添加降级限流策略

对于这三个问题,都可以使用 降级限流策略 解决,但是降级限流会影响用户体验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/803561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【牛客面试必刷TOP101】Day1.反转链表和合并两个排序的链表

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:牛客面试必刷TOP101 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&…

思科视频会议改造为云视频会议

复杂、封闭、昂贵是传统硬件视频会议的明显特点,面对现在多样化的参会需求,传统硬件视频会议固定在会议室的方式需要改变,并需要多层级来参与的时候,我们如何部署视频会议室升级改造方案。 用户需求: 新生活集团(中国…

爬虫分析必备技能:Chrome浏览器使用$x()快速提取列表内容

尝试快速打印一个页面的列表信息,我尝试用console.log$x()快速打印结果。 先找到一个合适的测试对象,比如csdn首页的热点: 按F12进入开发者工具找到这个列表的xpath: 根据我写的xpath找到了5个: 尝试把其中一个的标题…

【ABAP】事务码F-02/FB01/FB02 会计凭证过账BTE增强

需求:事务码F-02/FB01/FB02进行过账时,对行项目数据进行校验 流程: 事务码FIBF——环境(信息系统(处理)) 执行 找到1120事件选中,点击模式函数模块 点①复制函数,②出函…

百题千解计划【CSDN每日一练】计数问题(附解析+多种实现方法:Python、Java、C、C++、JavaScript、C#、go)

人要多久才能成熟!一瞬间?还是一辈子? 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌟[2] 2022年度博客之星人工智能领域TOP4🌟 🏅[3] 阿里云社区特邀专家博主🏅 🏆[4] CSDN-人工智能领域优质创作者🏆 �

用WhatsApp开拓和跟进客户,需要注意这些雷点

我们很多新手小白在利用WhatsApp开拓和维护客户的时候,总是容易犯一些错误,踩到雷点,这不利于客户对企业的印象,不利于增长,下面我们来说一些需要注意的点: 1、专业正确的用语 不管外贸人是跟进哪个国家…

tinkerCAD案例:16. 用字母创建你的名字

tinkerCAD案例:16. Create Your Name From Letters 用字母创建你的名字 letters together so they can be 3D printed. While this could be done with any word, in this example we will use my last name. In the make it your own lesson I provide additional…

全球掀复现「室温常压超导体」热潮,中国队已肝十几小时,韩国团队却内讧了

鱼羊 尚恩 发自 凹非寺 量子位 | 公众号 QbitAI 室温常压超导,这回是真的闹大了。 不止是在国内连上热搜,火速出圈引爆大众讨论。 铅磷灰石价格也在24小时之内迅速被炒了起来。 而物理界的科学家们,更是第一时间拉开了一场全球复现行动。 …

网络安全(黑客)自学误区

前言 网络安全是当今社会中至关重要的议题。随着科技的迅猛发展,网络已经渗透到我们生活的方方面面,给我们带来了巨大的便利和机遇。然而,网络也存在着各种风险和威胁,如黑客攻击、数据泄露等。因此,学习网络安全知识…

IDEA插件YapiUpload配置YApi

前后端分离开发项目,后端提供接口文档,这次使用的是YApi,不想一个个接口添加,所以用插件批量导入。 YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发…

Debezium日常分享系列之:定制Debezium 信号发送和通知

Debezium日常分享系列之:定制Debezium 信号发送和通知 一、自定义信号和通知通道二、结论 Debezium 2.3 在信号和通知功能方面引入了新的改进。除了 Debezium 提供的预定义信号和通知通道之外,您还可以设置新的信号和通知通道。此功能使用户能够自定义系…

数学建模学习(5):数学建模各类题型及解题方案

一、数学建模常见的题型 总体来说,数学建模赛题类型主要分为:评价类、预测类和优化类三种,其中优化类是最常见的赛题类 型,几乎每年的地区赛或国赛美赛等均有出题,必须要掌握并且熟悉。 二、评价类赛题 综合评价是数学…

【线程安全的讨论(一)】CPU多核缓存架构和JMM

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

@monaco-editor/react组件CDN加载失败解决办法

monaco-editor/react引入这个cdn资源会load失败 网上很多例子都是这样写的,我这样写monaco会报错 import * as monaco from monaco-editor; import { loader } from monaco-editor/react;loader.config({ monaco });改成这样 import * as monaco from monaco-edi…

2023年第三届控制理论与应用国际会议 | IET独立出版 | EI检索

会议简介 Brief Introduction 2023年第三届控制理论与应用国际会议(ICoCTA 2023) 会议时间:2023年10月20 -22日 召开地点:中国厦门 大会官网:www.icocta.org 控制理论作为一门科学技术,已经广泛地运用于我们社会生活方方面面。随着…

Java【Spring】 核心概念: 什么是 IoC, 什么是 DI?

文章目录 前言一、什么是Spring1, 什么是容器2, 什么是IoC 二、如何理解IoC1, 传统方式的代码编写2, 控制反转的代码编写3, 再谈IoC 三、什么是DI总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: 📕 JavaSE基础: 基础语法, 类和对象,…

西安电子科技大学

前言 本篇文章投稿与以下活动 【西安城市开发者社区】探索西安高校:展现历史与创新的魅力 资料参考与百度百科 学校简介 西安电子科技大学(Xidian University),简称“西电”,位于陕西省西安市,是中央部…

聚焦东南亚五国 | 7月TikTok达人数据洞察

或许中国直播的盛况,就会在东南亚重演。 据超店有数洞察,2023年7月东南亚TikTok主销五国(印度尼西亚、泰国、越南、马来西亚、菲律宾)带货达人数量环比上涨14.7%,其中越南、泰国市场达人数增长幅度远超均值,分别为25.46%、17.16%。…

代码随想录算法训练营第三天| 203.移除链表元素 707.设计链表 206.反转链表

链表是一种通过指针串联在一起的线性结构, 单链表 单链表每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。 双链…

搭建JMeter+Jenkins+Ant持续化

在D盘下新建文件夹Test,在其中填充文件夹 在 ant中解压 “apache-ant-1.9.14-bin.zip” 在TestAudo中新建文件夹 进入pc文件夹继续新建文件夹并把准备好的build.xml拖入 在resultlog中新建两个空文件夹 名称分为 html jtl 把准备好的baidu.jmx放入script 配置环境变量 在环…