缓存穿透、缓存击穿、缓存雪崩及其解决方案

news/2024/5/2 18:43:50/文章来源:https://blog.csdn.net/aHardDreamer/article/details/128066827

缓存(cache),大家都非常熟悉,几乎每个系统乃至整个计算机体系中都会用到。在分布式系统架构中,主要用于减轻数据库的压力,提高系统的响应速度和并发吞吐,即空间(内存)换时间。当大量的读、写请求涌向数据库时,磁盘的处理速度与内存显然不在一个量级,因此,在数据库之前加一层缓存,能够显著提高系统的响应速度,并降低数据库的压力。

缓存穿透

缓存穿透是指用户请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍,然后返回空。

如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大,甚至击垮数据库系统。

缓存穿透解决方案:

布隆过滤器(主键Hash):

优点:节省空间:不需要存储数据本身,只需要存储数据对应hash比特位时间复杂度低:插入和查找的时间复杂度都为O(k),k为哈希函数的个数

缺点:存在假阳性:布隆过滤器判断存在,可能出现元素不在集合中;判断准确率取决于哈希函数的个数不能删除元素:如果一个元素被删除,但是却不能从布隆过滤器中删除,这也是造成假阳性的原因

返回空对象:

当缓存未命中,查询持久层也为空,可以将返回的空对象写到缓存中,这样下次请求该key时直接从缓存中查询返回空对象,请求不会落到持久层数据库。为了避免存储过多空对象,通常会给空对象设置一个过期时间。

这种方法会存在两个问题:

如果有大量的key穿透,缓存空对象会占用宝贵的内存空间。空对象的key设置了过期时间,在这段时间可能会存在缓存和持久层数据不一致的场景。

缓存击穿

缓存击穿是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

危害:

数据库瞬时压力骤增,造成大量请求阻塞。

缓存击穿解决方案:

使用互斥锁:

这种思路比较简单,就是让一个线程回写缓存,其他线程等待回写缓存线程执行完,重新读缓存即可。同一时间只有一个线程读数据库然后回写缓存,其他线程都处于阻塞状态。如果是分布式应用就需要使用分布式锁。

缺点:如果是高并发场景,大量线程阻塞势必会降低吞吐量。

热点数据永不过期:

物理不过期,针对热点key不设置过期时间。逻辑过期,把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建。

这种方法对于性能非常友好,不足的就是构建缓存时候,其余线程(非构建缓存的线程)可能访问的是老数据,对于不追求严格强一致性的系统是可以接受的。

缓存雪崩

缓存雪崩是指缓存中数据大批量到过期时间,或者服务器/应用重启,而此时查询数据量巨大,请求直接落到数据库上,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

缓存雪崩解决方案:

1. 均匀过期

设置不同的过期时间,让缓存失效的时间点尽量均匀。通常可以为有效期增加随机值或者统一规划有效期。

2. 加互斥锁

跟缓存击穿解决思路一致,同一时间只让一个线程构建缓存,其他线程阻塞排队。

3. 缓存永不过期

跟缓存击穿解决思路一致,缓存在物理上永远不过期,用一个异步的线程更新缓存。

4. 保持缓存层的高可用性:

使用Redis 集群部署方式,即便个别Redis 节点下线,整个缓存层依然可以使用。除此之外,还可以在多个机房部署 Redis,这样即便是机房死机,依然可以实现缓存层的高可用。

 

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年天津财经大学珠江学院专升本经济学专业课考试大纲

天津财经大学珠江学院2023年高职升本科专业课考试《经济学》考试大纲一、本大纲系天津财经大学珠江学院2023年高职升本科《经济学》课程考试大纲。所列考试范围出自郑健壮、王培才主编的教材《经济学基础(第二版)》,清华大学出版社&#xff0…

React - Ant Design4.x版本安装使用,并按需引入和自定义主题

React - Ant Design4.x版本安装使用,并按需引入和自定义主题一. 安装使用 antd二.antd 高级配置安装 craco,对 create-react-app 的默认配置进行自定义自定义主题安装 babel-plugin-import ,按需加载组件代码和样式Ant Design官网…

mycat-3-实战篇

1 总结: 1:用的表必须在mycat的配置文件中配置。 2:mycat默认分片策略中,都是针对表的主键,默认是id,如果主键不是id的,请去rule.xml自己复制一份修改 3: 2 注意细讲解 1:schem…

车辆大全和车牌识别系统毕业设计,车牌识别系统设计与实现,车牌AI识别系统论文毕设作品参考

功能清单 【后台管理员功能】 系统设置:设置网站简介、关于我们、联系我们、加入我们、法律声明 广告管理:设置小程序首页轮播图广告和链接 留言列表:所有用户留言信息列表,支持删除 会员列表:查看所有注册会员信息&a…

TypeScript开启

TypeScript是什么? typescript是以JavaScript为基础构建的语言,是一个Javascript的超集,可以在任何支持JavaScript的平台中执行,typescript扩展了JavaScript,并添加了类型。 注意:ts不能被js直接解析执行&…

27个超实用Chrome DevTools 调试技巧 source 全局搜索(持续更新)

谷歌开发者工具提供了一系列的功能来帮助开发者高效 Debug 网页应用,让他们可以更快地查找和修复 bug。在谷歌的开发者工具中,有非常多有用的小工具,但是很多开发者并不知道。通过这篇文章,我把我常用的那些高效 Debug 的 Chrome …

大数据(9f)Flink双流JOIN

文章目录概述开发环境使用状态列表实现 INNER JOIN(双流connect后CoProcessFunction)基于间隔的JOIN(Interval Join)基于窗口的JOIN(Window Join)概述 Flink双流JOIN可用算子或SQL实现,FlinkSQ…

Flutter 5 大本地数据库解决方案

Flutter 5 大本地数据库解决方案 原文 https://levelup.gitconnected.com/top-5-local-database-solutions-for-flutter-development-6351cd494070 前言 这里列出了最流行的数据库解决方案以及代码示例。 选择正确的数据管理系统对于提高效率和可 extension 性以及影响可用性和…

PyQt5学习笔记--摄像头实时视频展示、多线程处理、视频编解码

目录 1--前言 2--基于Qt Designer设计ui文件 3--视频的编解码操作 4--完整代码 5--结果展示 6--存在的问题 7--参考 1--前言 ① 创建两个线程,主线程为ui线程,子线程用于读取摄像头视频,将处理后的图像帧数据(处理操作可以…

JDBC操作数据库实现增、删、查、改

0.JDBC概念 实际开发中,手动的输入SQL语句是少之又少,大多数情况下是通过编译代码进行来控制自动执行. 具体操作如下: 上述展示有一个【自己写的Mysql客户端】,这种操作是非常容易的,因为各种数据库本身就提供一系列的API,可以让用户很方便…

内存一致性,指令重排序,内存屏障,volatile解析

文章目录为什么会存在“内存可见性”问题重排序与内存可见性的关系as-if-serial语义单线程程序的重排序规则多线程程序的重排序规则happen-before是什么解决方案:内存屏障Volatile关键字解决内存可见性问题的实现原理为什么会存在“内存可见性”问题 下图为x86架构…

如何利用快解析远程访问家庭智能网关

随着家庭宽带用户的暴增,涌现出了许多连接家居设备和控制中心的产品,如家庭智能网关。家庭智能网关是家居智能化的心脏,通过它实现系统的信息采集、信息输入、信息输出、集中控制、远程控制、联动控制等功能。 ​ 智能家庭网关具备智能家居控…

3D-SKIPDENSESEG医学图像分割

蓝色三角、黄色三角、红色三角相对应。 得到第三个feature map,反卷积会恢复到原来的尺寸 Dense block,通道增加了 Transition,池化 用正则表达式把里面的h5文件匹配一下吧 os.path.join()把两个部分的路径拼一下 root_path —data_train *.…

day13_面向对象的三大特征之一(封装)

封装概述 为什么需要封装? 现实生活中,每一个个体与个体之间是有边界的,每一个团体与团体之间是有边界的,而同一个个体、团体内部的信息是互通的,只是对外有所隐瞒。例如:我们使用的电脑,内部…

链表之删除单链表中的重复节点

文章目录删除单链表中的重复节点题目描述解题思路代码实现删除单链表中的重复节点 力扣链接 题目描述 编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。 示例1:输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]示例2:输入:…

潜匿的怪物,你的供应链真的安全吗?

网络钓鱼、DNS欺骗      勒索软件、MITM攻击      在这个网络环境      风声鹤唳的时代      这些网络攻击类型      你一定不会感到陌生      无孔不入,这个词用来形容网络攻击毫不为过。世上没有绝对锋利的矛,同样也没有坚不可摧的盾,即使您养成了安…

这五个适合上班族的副业你知道多少

第二职业赚钱的路子有什么?从理论上讲,第二职业就是一个创业的过程,也遵照自主创业一般规律。可是第二职业是在业余时间和没有灵活运用资源挣钱,和创业有所不同。第二职业门坎变低,更比较发达,因此今天小编…

vmware虚拟机centos7扩容

vmware先进行磁盘扩展 从原来的20G扩展到100G: 扩展磁盘时可能会遇到需要修复磁盘的情况: // 进入vmware安装目录cd D:\开发工具\VMWare\ // 修复, 其中.vmdk文件为虚拟机磁盘文件vmware-vdiskmanager -R "F:\VM_Centos\CentOS 7 64 位.vmdk" 扩展成功&#xff1…

合作对策模型的简单实现

以如下题目作为示例: 一位歌手(S),一位钢琴家 (P) 和一位鼓手(D) 组成一个小乐队在俱乐部同台演出能得到演出费1000元,若歌手和钢琴家一起演出能得800元。而只有钢琴家和鼓手一起演出能得到650元,钢琴独奏表演能得300元&#xff…

动态加载布局的技巧

文章目录动态加载布局的技巧使用限定符使用最小宽度限定符动态加载布局的技巧 使用限定符 在平板上面大多数时候采用的双页的模式,程序会在左侧列表上显示一个包含子项列表,右侧的面版会显示详细的内容的因为平板具有足够大的屏幕.完全能够显示两页的内容.但是在手机上手机只能…