缓存雪崩、击穿、击穿

news/2024/5/20 6:17:37

缓存雪崩:

就是大量数据在同一时间过期或者redis宕机时,这时候有大量的用户请求无法在redis中进行处理,而去直接访问数据库,从而导致数据库压力剧增,甚至有可能导致数据库宕机,从而引发的一些列连锁反应,导致整个系统崩溃。

缓存雪崩的场景通常有两个:

1.大量热点key同时过期;

2.缓存服务故障;

缓存雪崩的解决方案:

1.通常的解决方案是将key的过期时间后面加上一个随机数(比如随机1-5分钟),让key均匀的失效。

2.考虑用队列或者锁的方式,保证缓存单线程写,但这种方案可能会影响并发量。

3.热点数据可以考虑不失效,后台异步更新缓存,适用于不严格要求缓存一致性的场景。

4.双key策略,主key设置过期时间,备key不设置过期时间,当主key失效时,直接返回备key值。

5.构建缓存高可用集群(针对缓存服务故障情况)。

6.当缓存雪崩发生时,服务熔断、限流、降级等措施保障。

缓存击穿:

缓存雪崩是指只大量热点key同时失效的情况,如果是单个热点key,在不停的扛着大并发,在这个key失效的瞬间,持续的大并发请求就会击破缓存,直接请求到数据库,好像蛮力击穿一样。这种情况就是缓存击穿(Cache Breakdown)。

从定义上可以看出,缓存击穿和缓存雪崩很类似,只不过是缓存击穿是一个热点key失效,而缓存雪崩是大量热点key失效。因此,可以将缓存击穿看作是缓存雪崩的一个子集。

解决方法:

  1. 设置永不过期:对于一些热点数据,可以设置其key永不过期,这样即使缓存失效,也能保证这些数据能够被快速访问,从而减少对数据库的直接访问。
  2. 使用分布式锁:通过分布式锁来控制对某个资源的访问,确保同一时间只有一个请求去数据库查询数据,然后将结果更新到缓存中。这样可以避免多个请求同时访问数据库,造成的高负载。
  3. 预加载热点数据:在系统启动或应用程序运行时,提前加载并缓存那些可能会频繁被访问的热点数据。这样即使在缓存失效后,也能迅速从缓存中获取数据,而不是每次都去数据库查询。
  4. 限流:通过限流技术限制对热点资源的访问速率,避免因请求量过大而导致的缓存击穿现象。这可以通过设置请求的频率限制、延迟响应等方式实现。
  5. 二级缓存:设计一个二级缓存系统,当一级缓存失效时,可以尝试从二级缓存中获取数据,以此来减少对数据库的直接访问。
  6. 布隆过滤器:虽然布隆过滤器主要用于缓存穿透问题,但它也可以用来预防缓存击穿,因为它可以帮助判断一个请求是否可能访问到缓存中的数据,从而减少无效的数据库查询。

缓存穿透

缓存穿透(cache penetration)是用户访问的数据既不在缓存当中,也不在数据库中。出于容错的考虑,如果从底层数据库查询不到数据,则不写入缓存。这就导致每次请求都会到底层数据库进行查询,缓存也失去了意义。当高并发或有人利用不存在的Key频繁攻击时,数据库的压力骤增,甚至崩溃,这就是缓存穿透问题。

缓存穿透发生的场景一般有两类:

原来数据是存在的,但由于某些原因(误删除、主动清理等)在缓存和数据库层面被删除了,但前端或前置的应用程序依旧保有这些数据;

恶意攻击行为,利用不存在的Key或者恶意尝试导致产生大量不存在的业务数据请求。

缓存穿透通常有四种解决方案,我们逐一介绍分析。

方案一:缓存空值(null)或默认值

分析业务请求,如果是正常业务请求时发生缓存穿透现象,可针对相应的业务数据,在数据库查询不存在时,将其缓存为空值(null)或默认值。需要注意的是,针对空值的缓存失效时间不宜过长,一般设置为5分钟之内。当数据库被写入或更新该key的新数据时,缓存必须同时被刷新,避免数据不一致。

方案二:业务逻辑前置校验

在业务请求的入口处进行数据合法性校验,检查请求参数是否合理、是否包含非法值、是否恶意请求等,提前有效阻断非法请求。比如,根据年龄查询时,请求的年龄为-10岁,这显然是不合法的请求参数,直接在参数校验时进行判断返回。

方案三:使用布隆过滤器请求白名单

在写入数据时,使用布隆过滤器进行标记(相当于设置白名单),业务请求发现缓存中无对应数据时,可先通过查询布隆过滤器判断数据是否在白名单内,如果不在白名单内,则直接返回空或失败。

方案四:用户黑名单限制

当发生异常情况时,实时监控访问的对象和数据,分析用户行为,针对故意请求、爬虫或攻击者,进行特定用户的限制;

当然,可能针对缓存穿透的情况,也有可能是其他的原因引起,可以针对具体情况,采用对应的措施。

总结:


http://www.mrgr.cn/p/32060057

相关文章

HFSS学习-day2-T形波导的优化设计

入门实例–T形波导的内场分析和优化设计 HFSS--此实例优化设计 优化设计要求1. 定义输出变量Power31、Power21、和Power11,表示Port3、Port2、Port1的输出功率2.参数扫描分析添加扫描变量和输出变量进行一个小设置添加输出变量进行扫描分析 3. 优化设计&#xff0c…

第八章——软件工程基础知识

软件工程概述,软件开发模型,软件开发方法,需求分析,系统设计,系统测试,软件开发项目管理,软件质量,软件度量第八章——软件工程基础知识 软件工程概述 软件开发模型 软件开发方法 需求分析 系统设计 系统测试 软件开发项目管理 软件质量 软件度量

libcity笔记:libcity/evaluator/traj_loc_pred_evaluator.py

1 构造函数 2 _check_config 检查配置是否符合评估器的要求,确保评估过程能够顺利执行 3 collect 4 evaluate 5 save_result & clear

BACnet转MQTT网关智联楼宇json格式自定义

智能建筑的BACnet协议作为楼宇自动化领域的通用语言,正逐步迈向更广阔的物联网世界。随着云计算和大数据技术的飞速发展,如何将BACnet设备无缝融入云端生态系统,成为众多楼宇管理者关注的焦点。本文将以一个实际案例,揭示BACnet网…

LNMP部署wordpress

1.环境准备 总体架构介绍 序号类型名称外网地址内网地址软件02负载均衡服务器lb0110.0.0.5192.168.88.5nginx keepalived03负载均衡服务器lb0210.0.0.6192.168.88.6nginx keepalived04web服务器web0110.0.0.7192.168.88.7nginx05web服务器web0210.0.0.8192.168.88.8nginx06we…

Linux 中如何设置每个特定的时间执行特定的程序

那会突然想到一个问题,如何每隔一段时间执行特定的程序。想到了如下的一种方法: 测试如下: 一个小问题,比如 每隔5秒统计一个特定文件的行数 001、[b20223040323@admin1 test]$ ls false.gff pan.fna pan.fna.fai record.sh true.gff variable.gff x_variable_protei…

shell脚本,删除30天以前的日志,并将日志推送到nas,但运行出现/bin/bash^M。

删除30天以前的日志 将日志推送到nas中,然后删除pod中的日志 pod挂载到本地 运行出现/bin/bash^M 1、删除30天以前的日志: #! /bin/bash# 定义源日志目录 LOG_DIR/home/log/ # 删除日志 find $LOG_DIR -type f -name "*.log" -mtime 30 -exec…

TextMeshPro - 艺术字(图片字)

1、首先要有一张包含了图片字的图集,每个图片字一个Spirte 2、然后右键 -> 创建创建好的TMP_Sprite Asset 3、编辑Sprite Character Table 调整顺序,将index和图片数字对上 修改下Unicode值(默认都是0xFFFE),比如9的Unicode为0x0039。(注意:填写完后,按Enter没用,…

设置默认表空间和重命名

目录 设置默认表空间 创建的临时表空间 tspace4 修改为默认临时表空间 创建的永久性表空间 tspace3 修改为默认永久表空间 重命名表空间 将表空间 tspace3 修改为 tspace3_1 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/13520…

神经网络案例实战

🔎我们通过一个案例详细使用PyTorch实战 ,案例背景:你创办了一家手机公司,不知道如何估算手机产品的价格。为了解决这个问题,收集了多家公司的手机销售数据:这些数据维度可以包括RAM、存储容量、屏幕尺寸、…

【Qt 开发基础体系】Qt信号与槽机制

文章目录 1.Qt 信号与槽机制原理(Signal & Slot)2. QObject 类 connect 的介绍3. 信号与槽机制连接方式4. 信号和槽机制优势及其效率:3. 信号与槽机制应用 1.Qt 信号与槽机制原理(Signal & Slot) &#x1f42…

注册表延长Windows更新时间

打开注册表【Win】+【R】打开运行窗口输入regedit在输入框中输入计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings后回车在右侧空白处选择新建->DWORD(32位)值(D)命名为FlightSettingsMaxPauseDays,选中10进制数据数值为暂停更新的天数。 确定后关…

error: pathspec ‘XXX‘ did not match any file(s) known to git

使用vscode,在本地开发切换分支时,报以下错误: error: pathspec XXX did not match any file(s) known to git 该问题是由于没有对应分支的原因。 首先使用一下命令,查看本地及远程的所有分支。 git branch -a 若没有对应的分…

Mamba结构的Demo源码解读

文章目录 前言一、mamba结构构建辅助函数解读1、dataclass方法解读2、Norm归一化LayerNormRMSNormRMSNorm源码 3、nn.Parameter方法解读 二、mamba原理二、mamba模型构建1、主函数入口源码解读2、Mamba类源码解读 三、ResidualBlock的mamba结构源码解读四、MambaBlock构成Resid…

The Lost Door

下载下来是一个exe文件 __int64 __fastcall check(char *a1) {char v1; // alchar v3[32]; // [rsp20h] [rbp-60h] BYREF_DWORD v4[8]; // [rsp40h] [rbp-40h] BYREF__int64 v5; // [rsp60h] [rbp-20h]__int64 v6; // [rsp68h] [rbp-18h]__int64 v7; // [rsp70h] [rbp-10h]__i…

2024第16届成都教育连锁加盟展6月1日举办 免费参观

2024第16届成都教育连锁加盟展6月1日举办 免费参观 邀请函 主办单位: 中国西部教体融合博览会组委会 承办单位:重庆港华展览有限公司 博览会主题:责任教育科技兴邦 幼教、普教、高教、校外教育、K12学科辅导、婴幼儿教育、兴趣辅导、学…

Face Detection API

一个针对图像中的人脸进行识别的底层加速平台组件<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0…

【MATLAB源码-第205期】基于matlab的LDPC译码算法仿真,对比BF算法,最小和算法,对数BP和概率BP四种算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 LDPC 码简介 LDPC码是一种通过稀疏奇偶校验矩阵定义的线性分组码&#xff0c;1962年由Gallager首次提出。这种码具有高效的解码性能&#xff0c;尤其在接近香农极限的情况下&#xff0c;其性能表现尤为突出。LDPC码的核心特…

嘉楠堪智 CanMV K230 进行 Linux、RT-smart 系统开发

本文记录学习、使用 K230 SDK 进行 Linux、RT-smart 系统的开发的一些关键步骤&#xff0c;如何获取系统源代码&#xff0c;如何配置环境&#xff0c;如何使用 Docker 进行编译&#xff0c;获得系统文件。 具体详细的教程&#xff0c;可以学习 CanMV K230 教程。 目录 一、S…

如果你还不了解 Java Class 文件结构,来看看这篇吧

文章首发于【Java天堂】,跟随我探索Java进阶之路!Class文件是什么 Java Class文件是Java编译器将源代码编译后的二进制表示,它是Java虚拟机(JVM)运行的基础。 Class文件绝大部分内容是在1997年发布的第一版《Java虚拟机规范》中就已经定义好的,后续20多年的发展过程当中J…