缓存雪崩、击穿、击穿

缓存雪崩:

就是大量数据在同一时间过期或者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.hqwc.cn/news/679175.html

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

相关文章

顺序栈的操作

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝既然选择了远方,当不负青春…

Jmeter用jdbc实现对数据库的操作

我们在用Jmeter进行数据库的操作时需要用到配置组件“JDBC Connection Configuration”,通过配置相应的驱动能够让我们通过Jmeter实现对数据库的增删改查,这里我用的mysql数据库一起来看下是怎么实现的吧。 1.驱动包安装 在安装驱动之前我们要先查看当前…

程序员的实用神器——高效软件开发的秘诀

目录 前言 一、自动化测试工具 (一)常用的自动化测试工具 (二)编写有效的测试用例的建议 (三)提高代码覆盖率的方法 二、持续集成/持续部署 (一)持续集成(CI&#…

【iOS】-- 内存五大分区

【iOS】-- 内存五大分区 内存五大分区1.栈区优点: 2.堆区优点: 3.全局区4.常量区5.代码区 验证static、extern、const关键字比较1.static关键字static关键字的作用:全局静态变量局部静态变量 2.extern关键字对内的全局变量对外的全局变量 3.c…

VMware Workstation 虚拟机学习 安装centos7.9

1打开VMware Workstation--文件--新建虚拟机 #选择对应的,本例选择最新的 2开始安装centos #网卡配置 vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITy…

哪个文件加密软件好?迅软加密软件特性解析

哪个文件加密软件好? 这里推荐一款好用的文件加密软件,迅软DSE加密软件,有17年的加密经验了,已为三十万企业解决信息安全问题。简单易用,兼容性强,各类型文件都可加密。完善的售后保障,各地有服…

Colibri for Mac v2.2.0 原生无损音频播放器 激活版

Colibri支持所有流行的无损和有损音频格式的完美清晰的比特完美播放,仅使用微小的计算能力,并提供干净和直观的用户体验。 Colibri在播放音乐时使用极少的计算能力。该应用程序使用最先进的Swift 3编程语言构建,BASS音频引擎作为机器代码捆绑…

Linux学习笔记1

1.背景认知 可能很多人还没有接触Linux,会有点畏惧,我们可以把Linux类比成Windows, 下面是Windows和Linux的启动对比 Windows:上电后一开始屏幕是黑黑的---bios在启动Windows----Windows之后找到c盘启动各种应用程序 Linux&am…

连接docker中的MySQL出现2058错误

出错场景:在虚拟机中用docker技术下载最新版本的MySQL,在本地电脑上连接发现出现2058错误。 解决方法: 按照以下步骤 1. 2. ALTER USER root% IDENTIFIED WITH mysql_native_password BY 自己MySQL的密码; 3.成功

第2章.STM32开发C语言常用知识点

目录 0. 《STM32单片机自学教程》专栏总纲 2.1. STM32嵌入式开发C语言编程的不同 2.2. C语言常用知识点 2.2.1 位操作 2.2.2 define 宏定义 2.2.3 条件编译 2.2.3.1 #ifdef 2.2.3.2 #ifndef 2.2.3.3 #if !defined 2.2.4 extern 变量声明 2.2.5 typedef 类型别名 …

2W 6KVDC 隔离双输出 DC/DC 电源模块——TPJ-2W 系列

TPJ-2W一款有超高隔离电压的电源模块,主要用于隔离度要求高的如医疗仪器和设备,特别在安全设备的应用中起着相当重要的作用,它的绝缘设计完全能满足对隔离电压要求超过6KVDC的应用,在额定负载2W的情况下,工作温度范围为…

MM模块学习一(供应商创建,物料类型的定义及功能)

物料管理流程: 源头:采购需求->采购申请 MRP:物料需求计划。运行物料需求计划的结果,根据物料的性质来判断是外购(采购申请)或者是生产(计划订单->生产订单)。 采购申请&am…