Redis缓存三大问题

article/2025/9/22 15:39:56

缓存三大问题

​ 我们都知道,Redis的Key都存在一个ttl(time to live)过期时间,Redis默认的是永不过期。Redis作为缓存,一方面可以提升速度,但也会带来三大常见的缓存问题:缓存穿透缓存击穿缓存雪崩

​ Redis作为缓存使用,一般为后端的缓存,主要对MySQL中的热点数据作缓存,减少对数据库的访问,因为MySQL查询效率远不及Redis。一般缓存的使用方式如下图所示:

在这里插入图片描述

缓存运行原理:当业务系统发送数据查询请求时,首先会在缓存中查看数据是否存在,如果存在,从缓存中获取数据并返回;否则,进入数据库中查询,找到数据后再返回。

1 、缓存穿透

概念:业务系统查询缓存和数据库中都不存在的数据。当通过接口发送数据查询请求,请求的数据在缓存中没有,转而所有请求转向数据库,但是数据库中也不存在该数据。此时,缓存起不到保护数据库的作用,就像被穿透了一样,这种现象称为缓存穿透。

危害:如果黑客大量发起不存在的数据请求,海量的请求转向数据库,数据库承受不了流量洪峰,数据库压力剧增,可能导致系统瘫痪。在目前的业务系统中,比较脆弱的就是IO部分。

解决方案:

  • 前端验证。对于接口的请求参数进行前端校验,验证合格后再发起后端数据查询请求。
//验证表单是否为空,若为空则将焦点聚焦在input表单上,否则表单通过,登录成功
function check(form){var accountName = $("#accountName"),$password = $("#password");var accountName = accountName.val(),password = $password.val();if(!accountName || accountName == ""){showMsg("请输入用户名");form.accountName.focus ();return false;}if(!password || password == ""){showMsg("请输入密码");form.password.focus ();return false;}
//这里为用ajax获取用户信息并进行验证,如果账户密码不匹配则登录失败,如不需要验证用户信息,这段可不写$.ajax({url : systemURL,// 获取自己系统后台用户信息接口data :{"password":password,"accountName":accountName},type : "GET",dataType: "json",success : function(data) {if (data){if (data.code == "1111") { //判断返回值,这里根据的业务内容可做调整setTimeout(function () {//做延时以便显示登录状态值showMsg("正在登录中...");console.log(data);window.location.href = url;//指向登录的页面地址},100)} else {showMsg(data.message);//显示登录失败的原因return false;}}},error : function(data){showMsg(data.message);}});
}//错误信息提醒
function showMsg(msg){$("#CheckMsg").text(msg);
}//监听回车键提交
$(function(){document.onkeydown=keyDownSearch;function keyDownSearch(e) {// 兼容FF和IE和Operavar theEvent = e || window.event;var code = theEvent.keyCode || theEvent.which || theEvent.charCode;if (code == 13) {$('#submit').click();//具体处理函数return false;}return true;}
});
  • 缓存空值。之所以会发生缓存穿透,是因为缓存中不存在这些空数据的key,才会导致所有请求转向数据库。如果当数据库返回为空时,把这些空值对应的key缓存到Redis,并合理设置过期时间。

在这里插入图片描述

  • 使用布隆过滤器。布隆过滤器可以用于检索一个元素是否在一个集合中,它的优点是空间效率和查询时间比一般的算法要好得多。当业务系统发出查询请求的时候,首先去布隆过滤器中查询该key是否存在。如果不存在,则说明数据库中也不存在该数据,因此不需要查询,直接返回null。如果存在,则继续执行后续的流程,先前往Redis缓存中查询,缓存中没有的话再前往数据库中的查询。

在这里插入图片描述

方案选择:

(1)对于黑客的恶意攻击,查询的key值往往不同,而且数据量巨大。使用缓存空值的方法不大可取,可以使用布隆过滤器进行海量请求的过滤。

(2)如果查询的空数据,key值重复率高,可以选择缓存空值的方法。

2、 缓存击穿

概念:某个热点key存在与Redis缓存中,在它过期的一瞬间,大量查询该key的请求转向数据库,造成瞬间数据库的数据达到洪峰,压力剧增。这时缓存像是被击穿了一样,称为缓存击穿现象。

危害:海量的请求转向数据库,可能导致数据库服务器宕机,整个应用系统不能正常工作。

解决方案:

  • 使用互斥锁。当业务系统发出查询请求时,这时Redis缓存中对应地key失效了,会转向数据库查询,数据库查询完成后,查询完成后也会造成缓存重建重复。加上互斥锁不会发生这种现象,当第一个数据库查询请求发起后,就将缓存中该Key对应的数据上锁;此时到达缓存的其他查询请求将无法查询该字段,从而被阻塞。当第一个请求完成数据库查询,并将数据更新值缓存后,释放锁;此时其他被阻塞的查询请求将可以直接从缓存中查到该数据。但是,这样其他线程会被阻塞,导致系统的吞吐量下降。

在这里插入图片描述

  • 设置缓存数据用不过期。这里的不过期可以是设置永不过期,或者是在数据快要过期时,有异步的线程去构建缓存的热点数据,达到永不过期的效果。
  • 设置接口限流与熔断,降级。在业务系统中,重要的数据查询接口,一定要做好相应的限流措施,防止用户恶意访问,同时要进行降级准备。当接口中的某些服务不可用时,进行熔断。

方案选择:

(1)互斥锁方案,完全依赖于第一个线程进行缓存重建,其余线程查询新缓存中的数据。一旦构建缓存中过程出现问题,会出现线程死锁和线程池阻塞的风险。而且,这种方案会降低业务系统的吞吐量。

(2)设置永不过期方案,可能会出现问题,实际上已经不存在热点 key 产生的一系列危害,会存在数据不一致的情况,同时代码复杂度会增大。

3 、缓存雪崩

概念:大量的热点数据在同一时间过期,导致Redis缓存在同一时刻集体失效。同一时刻,对不同的过期key进行访问,引起雪崩的现象,造成瞬时数据库请求量大,压力骤增,数据库可能崩溃。
在这里插入图片描述

解决方案:

  • 优化缓存过期时间。将热点数据的过期时间打散。雪崩的原因,在于同一时刻,大量热点数据同时过期,我们只要给热点数据设置过期时间加个随机值,就能解决这个问题。
  • 保持Redis缓存层的高可用性。使用Redis 哨兵模式或者Redis 集群部署方式,即便个别Redis 节点宕机,整个缓存层依然可以使用。
  • 设置缓存数据用不过期。与防止缓存击穿的方案一致,这里的不过期可以是设置永不过期,或者是在数据快要过期时,有异步的线程去构建缓存的热点数据,达到永不过期的效果。
  • 使用互斥锁重建缓存。根据 key 去缓存层查询数据,当缓存层为命中时,对 key 加锁,然后从存储层查询数据,将数据写入缓存层,最后释放锁。若其他线程发现获取锁失败,则让线程休眠一段时间后重试。
  • 使用限流和降级组件。假如有一个资源不可用,可能会造成所有线程在获取这个资源时异常,造成整个系统不可用,可以降级补充热点数据,降级在高并发系统中是非常正常的。Hystrix是一款开源的“防雪崩工具”,它通过 熔断、降级、限流三个手段来降低雪崩发生后的损失。

同一时间过期,导致Redis缓存在同一时刻集体失效。同一时刻,对不同的过期key进行访问,引起雪崩的现象,造成瞬时数据库请求量大,压力骤增,数据库可能崩溃。

解决方案:

  • 优化缓存过期时间。将热点数据的过期时间打散。雪崩的原因,在于同一时刻,大量热点数据同时过期,我们只要给热点数据设置过期时间加个随机值,就能解决这个问题。
  • 保持Redis缓存层的高可用性。使用Redis 哨兵模式或者Redis 集群部署方式,即便个别Redis 节点宕机,整个缓存层依然可以使用。
  • 设置缓存数据用不过期。与防止缓存击穿的方案一致,这里的不过期可以是设置永不过期,或者是在数据快要过期时,有异步的线程去构建缓存的热点数据,达到永不过期的效果。
  • 使用互斥锁重建缓存。根据 key 去缓存层查询数据,当缓存层为命中时,对 key 加锁,然后从存储层查询数据,将数据写入缓存层,最后释放锁。若其他线程发现获取锁失败,则让线程休眠一段时间后重试。
  • 使用限流和降级组件。假如有一个资源不可用,可能会造成所有线程在获取这个资源时异常,造成整个系统不可用,可以降级补充热点数据,降级在高并发系统中是非常正常的。Hystrix是一款开源的“防雪崩工具”,它通过 熔断、降级、限流三个手段来降低雪崩发生后的损失。

http://chatgpt.dhexx.cn/article/LcEZdK6c.shtml

相关文章

Redis缓存

Redis 一、Redis简介 一般为了提升性能,会在存储层和客户端之间添加一个缓存层,当客户端向后端发送请求的时候,会先去缓存层查,看看是否有相应的数据,如果有则直接返回,这样就减轻存储层的压力&#xff0c…

【Redis缓存】

一、使用Redis缓存的优点 相比于数据库而言,缓存的操作性能更高,缓存性能高的主要原因有以下几点: 1、缓存一般都是key-value查询数据的,因为不像数据库一样还有查询的条件等因素,所以查询的性能一般会比数据库高&am…

Redis缓存机制(详解)

1.Redis 是什么? *redis是*一个运行在内存上的key-value存储系统。是NoSQL数据库之一 2.缓存穿透,缓存击穿,缓存雪崩 /**缓存穿透*/ 它会先查询Redis,Redis没有会查询数据库,数据库也没有这就是缓存穿透 业界主流解决方案:布隆过滤器布隆过滤器的使用步骤 布隆过滤器的使用步…

如何使用 Redis 缓存?

​ 编辑 添加图片注释,不超过 140 字(可选) 如何使用 Redis 缓存 前言 对于 Redis 来讲,作为缓存使用,是我们在业务中经常使用的,这里总结下,Redis 作为缓存在业务中的使用。 旁路缓存 Cach…

Redis实战——缓存

目录 1 前言 1.1什么是缓存? 1.2 缓存的作用及成本 1.3 Redis缓存模型 2 给商户信息添加缓存 3 缓存更新策略 3.1 更新策略介绍 3.2 主动更新策略 3.3 主动更新策略练习 4 缓存穿透及其解决方案 4.1 缓存穿透的概念 4.2 解决方案及实现 5 缓存雪崩的…

SpringBoot整合Redis缓存

SpringBoot整合Redis缓存 一、缓存概念知识1、是什么缓存2、缓存的优缺点3、为什么使用缓存 二、Redis概念知识1、Redis简介2、为什么用Redis作为缓存3、Redis 支持的数据类型4、Redis缓存常见问题1. 缓存穿透2. 缓存击穿3. 缓存雪崩4. 缓存一致性 三、SpringBoot整合redis1、使…

云平台的层次架构

云计算平台 ​ 云计算是一种资源的服务模式,该模式可以实现随时随地、便捷按需地从可配置计算资源共享池中获取所需的资源(如网络、服务器、存储、应用及服务),资源能够快速供应并释放,大大减少了资源管理工作开销。 ​ 经典云计算架构包括…

政务云平台服务

做政企项目交付,部署在政务云上的信息系统,经常会需要申请政务云资源,尤其是等保测评,还需要申请相关安全服务设施。 通过几个参考例子,简要说明政务云平台的自愿服务。 广州市信息化服务中心 广州市政府信息化云服…

SaaS的几种架构解析

转载:https://www.xugj520.cn/amp/SaaS_Architecture.html SAAS成熟度模型分级 LEVEL1 定制开发 软硬件都由SAAS服务商提供,软件的使用者只需要按时间、用户数、空间等逐步支付租赁使用费用即可 LEVEL2 可配置 通过不同的配置满足不同用户的需求&#…

SaaS云HIS系统源码功能介绍

SaaS云HIS首页功能:包括工作计划、预警、主功能菜单、医院机构公告。 一、工作计划 1.值班概况:值班日期、值班时间、值班科室(内科、外科等) 2.待处理患者:内科人数、外科人数等 病历统计:入院病历、出…

saas系统需要什么样的云服务器,SAAS系统和云服务器的区别

SAAS系统和云服务器的区别 内容精选 换一换 云耀云服务器默认设置的时区,是您制作镜像时选择的时区。如需修改,请参见本节内容,将其更改为所需的本地时间或网络中的其他时区。云耀云服务器登录成功后,如果发现云耀云服务器系统时间与本地时间不一致,建议更改时区,将云耀云…

虚拟化与云平台

虚拟化: 虚拟化技术就是指一台物理机上可以跑多台虚拟机,共享内存、CPU、IO等硬件资源,虚拟机之间在逻辑上是相互隔离的。 共享的物理机称为“宿主机”,虚拟机称为“客户机” 宿主机通过hypervisor将硬件资源虚拟化给客户机共享…

OneNET云平台

OneNET云平台 由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,快速完成产品开发部署,为智能硬件、智能家居产品提供完善的物联网解决方案。 OneNET致力于开发者的体验,逐步提升云服务体量,着手用户运营,深化运维管理和云端大数据分…

开源项目saas电商项目

1.线上电商私域电商一体化 数字化零售我们采用数字商城SaaS数字门店SaaS一体化结合赋能 数字门店SaaS,适用连锁门店,如杏花楼、廖记、奈雪的茶 数字商城SaaS,适用线上电商,对标《有赞》;如淘系商家 数字门店SaaS与数…

智能家居云平台设计

智能家居云平台设计 摘 要 智能家居是未来家居的发展方向,其利用先进的网络技术、计算机技术和无线通信技术等将家居中的各种电子电气设备连接起来,统一管理、远程监控和资源共享,实现了高效、便利的生活环境。近些年互联网的迅猛发展&…

云平台概念详解

1. 前言 随着云计算概念的不断落地和推广, 目前云平台已经得到了非常广泛的使用. 云平台帮助用户在: • 应用落地 • 服务落地 • 安全保障 • 性能 等方面获得比传统方式更高效, 更节省, 更稳定, 更方便的优势. 2. 云平台的概念 云平台也称云计算平台. 云计算…

云平台是什么、什么是云、云平台的分类、主流公有云平台有哪些、云的三种服务、PaaS、SaaS、IaaS

云平台的基础概念 1.1 前言 随着云计算概念的不断落地和推广, 目前云平台已经得到了非常广泛的使用. 云平台帮助用户在: 应用落地服务落地安全保障性能 等方面获得比传统方式更高效, 更节省, 更稳定, 更方便的优势. 1.2 云平台的概念 云平台也称云计算平台. 云计算, 顾名…

初代SAAS平台应用层架构设计

近期参与SAAS项目第一代应用设计,为满足整体灵活性,复用性和可定制化,得出如下应用层模型,希望能给大家相互参考学习,设计上有什么缺漏请多指教 核心思想 模块为最小化购买单位 例如商城模块 分销模块等多个模块组合…

SAP 云平台 (Cloud Platform) 架构概述

引言 在我们开始SAP云平台的架构之旅之前,让我们先看看SAP已经发布的一些其他云产品。这些云产品方案可以分为公有云和私有云两种。 SAP公有云解决方案见下图最右侧,比较著名的有SAP SuccessFactors和SAP Cloud for Customer(C4C)等,作为SAP软…

大型JAVA智慧校园云平台SaaS源码

▶ 让技术回归教育 智慧校园完整技术栈: 前后端分离 1、使用springboot框架Javavue2 2、数据库MySQL5.7 3、移动端小程序使用小程序原生语音开发 4、电子班牌固件安卓7.1;使用Java Android原生 5、elmentui ,Quartz,jpa&#xff…