当前位置:网站首页>缓存穿透、缓存击穿、缓存雪崩以及解决方案
缓存穿透、缓存击穿、缓存雪崩以及解决方案
2022-08-04 03:06:00 【Java精灵儿】
1、缓存穿透
描述:
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
解决方案:
接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
2、缓存击穿
描述:
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
解决方案:
设置热点数据永远不过期。
加互斥锁,互斥锁
对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。
缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
3、缓存雪崩
描述:
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
解决方案:
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
设置热点数据永远不过期。
缓存失效时的雪崩效应对底层系统的冲击非常可怕。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线 程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。这里分享一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
边栏推荐
- In the season of going overseas, the localization of Internet tips for going overseas
- 2022支付宝C2C现金红包PHP源码DEMO/兼容苹果/安卓浏览器和扫码形式
- 案例 | 重庆银行流动数据安全挑战及应对实践
- 全网没有之一的JMeter 接口测试流程详解
- Pine脚本 | 如何显示和排版绘图开关?
- Brush esp8266-01 s firmware steps
- 各位大佬好,麻烦问一下flink cdc oracle写入doris的时候,发现cpu异常,一下下跑
- 安装postgis时报找不到“POSTGIS_VERSION”这个函数
- unsafe.Pointer, pointer, reference in golang
- Why use Selenium for automated testing
猜你喜欢
How to drop all tables under database in MySQL
There are too many systems, how to realize multi-account interworking?
Utilities of Ruineng Micrometer Chip RN2026
MCU C language -> usage, and meaning
仿牛客论坛项目梳理
一个属于程序员的七夕节!
[Playwright Test Tutorial] 5 minutes to get started
全网没有之一的JMeter 接口测试流程详解
逻辑漏洞----其他类型
ant-design的Select组件采用自定义后缀图标(suffixIcon属性)时,点击该自定义图标没有反应,不会展示下拉菜单的问题
随机推荐
一文看懂推荐系统:召回05:矩阵补充、最近邻查找,工业界基本不用了,但是有助于理解双塔模型
View mysql deadlock syntax
Architecture of the actual combat camp module three operations
MySQL query optimization and tuning
sqoop ETL tool
高效IO模型
Pine Script | How to display and typeset a plot switch?
DIY电工维修如何拆卸和安装开关面板插座
pnpm 是凭什么对 npm 和 yarn 降维打击的
WPE详细教程
[Playwright Test Tutorial] 5 minutes to get started
new Date converts strings into date formats Compatible with IE, how ie8 converts strings into date formats through new Date, how to replace strings in js, and explain the replace() method in detail
安装postgis时报找不到“POSTGIS_VERSION”这个函数
MRS: Alluxio的使用介绍
自定义通用分页标签02
STM8S105K4T6------串口发送和接收
STM8S105k4t6c--------------点亮LED
怎样提高网络数据安全性
网络工程师入门必懂华为认证体系,附系统学习路线分享
STM8S project creation (STVD creation) --- use COSMIC to create a C language project