redis缓存失效问题

缓存时效问题

缓存穿透

问题说明:指大量请求缓存中不存在的数据,导致这些请求都访问备用数据源(如数据库、外部服务等),从而引起系统资源浪费和性能问题。
解决方案:有“参数校验”、“缓存空值”、“布隆过滤器检测记录ID存在性”3种。使用布隆过滤器的方案较为复杂,建议优先考虑参数校验、缓存空值。

  1. 参数校验:通过参数校验拦截非法请求,避免不必要的查询。
  2. 缓存空值:数据源查询结果为空时,将Redis缓存值设置为特殊值,以标识记录不存在。具体流程如下图所示。


3. 布隆过滤器检测记录ID存在性:利用布隆过滤器以较小的内存开销、时间复杂度实现存在性判断,具体用法如下。
1)基于数据库记录初始化布隆过滤器;
2)新增记录时,同步将该记录的ID添加到布隆过滤器里;
3)查询Redis缓存前,先使用布隆过滤器检查。如果布隆过滤器判断不存在,则记录一定不存在。如果布隆过滤器判断可能存在,才会查询Redis。

在这里插入图片描述


使用布隆过滤器时,不易支持删除记录的场景,目前只提供简单的Gauva的示例,会冗余存储在各个应用实例,且一致性较低(新增记录生效延迟),若使用Redis存储Bloom过滤器的数据需考虑Redis中的数据丢失等问题。

  1. 缓存击穿
    问题说明:指在高并发情况下,一个热点key失效或未缓存时,大量请求同时访问备用数据源(如数据库、外部服务等),导致备用数据源压力过大甚至宕机的情况。
    解决方案:有“控制并发量”、“二级缓存”、“双key”、“后台刷新热数据”4种。优先考虑控制并发量,对响应时间较敏感的情况可同时考虑二级缓存或双key。
  2. 控制并发量: 如果热点key在缓存中不存在,将通过控制访问备用数据源的并发量,避免对备用数据源造成冲击。 如果当前场景实例较多、请求量较大,可以考虑使用分布式锁控制并发,否则可基于简化实现的角度考虑使用Java提供的互斥锁、限制连接池的最大连接数等机制。
    在这里插入图片描述


该方案如上图所示,若干个线程同时请求,第一个到达的线程会加锁,后续线程只能阻塞等待,直到第一个线程执行完。
2. 二级缓存: 使用互斥锁只允许一个线程更新缓存,其他线程需要等待。为了解决该问题,可以结合业务场景考虑添加“二级缓存”方案。 具体为,使用Redis缓存(A1)和本地缓存(A2)两个缓存,A2缓存过期时间长于A1。A1失效时,第一个线程将会去数据源中查询,其他线程可以先返回A2缓存中的数据,避免等待。
3. 双key: 也可以用“双key”方案分别缓存“缓存过期时间”和”缓存数据”,解决其他线程等待的问题。具体流程为:
1)如果“缓存过期时间”Key过期,则更新该Key;
2)若某个线程成功更新“缓存过期时间”Key,该线程将会从数据源获取数据并更新”缓存数据”Key;
3)其他线程将会直接获取”缓存数据”Key的旧数据并返回。

在这里插入图片描述


4. 后台刷新热数据: 通过定时任务后台刷新,避免热点数据丢失。该方案需考虑区分业务上的热点数据和非热点数据,且要设置合理的过期时间,不推荐使用。

  1. 缓存雪崩
    问题说明:指因Redis故障、操作不当等原因导致缓存中大量的键同时失效,导致所有相关的请求都落到了备用数据源(比如数据库),从而造成备用数据源瞬间压力过大甚至宕机的情况。
    解决方案:有“控制并发量”、“设置适当的过期时间”、“拷贝缓存”、“熔断”4种方案。通常采用“熔断”方案,对于采用双活实例部署架构的场景可同时考虑双活实例的“拷贝缓存”。
    具体方案如下:
  1. “控制并发量”:参考“缓存击穿”部分中的“控制并发量”方案,控制请求备用数据源的并发量;
  2. “设置适当的过期时间”:为Key的过期时间合理设置随机偏移量以打散过期时间;
  3. “拷贝缓存”:对于采用“双活实例”部署架构提升Redis缓存层高可用的场景,可考虑拷贝缓存以降低Redis雪崩的概率;
  4. “熔断”: 可根据错误率、响应时间等设置熔断机制。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

html 单页面引用vue3和element-plus

引入方式: element-plus基于vue3.0,所以必须导入vue3.0的js文件,然后再导入element-plus自身所需的js以及css文件,导入文件有两种方法:外部引用、下载本地使用 通过外部引用ElementPlus的css和js文件 以及Vue3.0文件 …

LG 选择 Flutter 来增强其智能电视操作系统 webOS

可以这个话题会让大多数人困惑,2024 年了为什么还会冒出 webOS 这种老古董?然后 LG 为什么选择 webOS ?现在为什么又选择 Flutter ? 其实早在 Google I/O 发布 Flutter 3.22 版本的时候,就提到了 LG 选择 Flutter 来增…

Postfix+Dovecot+Roundcube开源邮件系统搭建系列1-2:系统搭建目标+MariaDB数据库配置(MySQL)

1. 系统搭建目标 通过本系列文章,最终可以部署一套提供如下服务的邮件系统: SMTP服务:由Postfix提供,监听25、465、587端口。POP3服务:由Dovecot提供,监听110、995端口。IMAP服务:由Dovecot提…

el-table fixed固定列导致错位的解决方法介绍

问题描述: Element UI table组件可以通过设置fixedright属性实现列的固定,但是在某些情况下会导致固定列的样式错乱,只要刷新页面即出现表格错位问题,下面就总结下解决样式错乱实现方案 官方解决方案: 对 Table 进行重新布局。当 Table 或其…

安全防御:智能选路

目录 一、智能选路 1.1 就近选路 1.2 策略路由 1.3 虚拟系统---VRF 二、全局选路策略 1,基于链路带宽进行负载分担 2,基于链路质量进行负载分担 3,基于链路权重的负载分担 4,根据链路优先级的主备备份 DNS透明代理 一、…

vue执行npm install问题idealTree:yudao-ui-admin-vben: sill idealTree buildDeps

前言: 查看vue终端默认地址 npm config get registry 结果:https://registry.npmjs.org/问题: 在拉取芋道源码前端的时候执行npm install 遇到问题如下:一直卡着不动 查看版本 按照网上方法更换镜像为阿里的,仍然不…

ORA-00756 ORA-10567故障处理---惜分飞

数据库异常断电之后,recover 报ORA-00756 ORA-10567等错 SQL> recover database; ORA-00756: 恢复操作检测到数据块写入丢失 ORA-10567: Redo is inconsistent with data block (file# 1,block# 113855,file offset is 932700160 bytes) ORA-10564: tablespace S…

搜维尔科技:【研究】触觉技术将在5年内以8种方式改变人们的世界

触觉技术在过去几年中发展迅猛,大大提高了反馈的精确度和真实度。其应用产生了真正的影响,数百家公司和企业都集成了触觉技术来增强培训和研究模拟。 虽然触觉技术主要用于 B2B 层面,但触觉技术可能会彻底改变我们的生活,尤其是通…

多类支持向量机损失(SVM损失)

(SVM) 损失。SVM 损失的设置是,SVM“希望”每个图像的正确类别的得分比错误类别高出一定幅度Δ。 即假设有一个分数集合s[13,−7,11] 如果y0为真实值,超参数为10,则该损失值为 超参数是指在机器学习算法的训练过程中需要设置的参数&#xf…

Spring Data Jpa 原生SQL联表查询返回自定义DTO

Spring Data Jpa 原生SQL联表查询返回自定义DTO 方案一:返回Map 这个就不说了 方案二:实体定义成接口的形式 该方式最直观!!推荐!!! 注意:XxxDto是interface接口,而…

(算法)区间调度问题

问题大致如下所述:有n项工作,每项工作分别在s时间开始,在t时间结束. 对于每项工作,你都可以选择参与与否,如果选择了参与,那么自始至终都必须全程参与. 此外,参与工作的时间段不能重复(即使是开始的瞬间和结束的瞬间的重叠也是不允许的). 你的目标是参…

工业三防平板助力工厂生产数据实时管理

在当今高度数字化和智能化的工业生产环境中,工业三防平板正逐渐成为工厂实现生产数据实时管理的得力助手。这种创新的技术设备不仅能够在恶劣的工业环境中稳定运行,还为工厂的生产流程优化、效率提升和质量控制带来了前所未有的机遇。 工业生产场景通常充…

VTK----3D picking的原理、类型及实现

目录 3D picking概述 3D射线投射原理 VTK picking框架 vtkPicker(选Actor) vtkPointPicker(选点) vtkCellPicker(选单元) vtkAreaPicker(框选) 3D picking概述 3D picking 是一种在三维场景中确定用户点击或指向的对象的技术。这在3D应用程序和游戏中非常常见,…

继承和多态常见的面试问题

文章目录 概念问答 概念 下面哪种面向对象的方法可以让你变得富有( A) A: 继承 B: 封装 C: 多态 D: 抽象 (D )是面向对象程序设计语言中的一种机制。这种机制实现了方法的定义与具体的对象无关, 而对方法的调用则可以关联于具体的对象。 A: 继承 B: 模板 C: 对象的…

Android C++系列:Linux线程(三)线程属性

linux下线程的属性是可以根据实际项目需要,进行设置,之前我们讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问 题。如我们对程序的性能提出更高的要求那么需要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数…

F5理念左移,实现API安全的全生命周期管理

API是我们现代数字生活中隐形的中枢神经系统,从远程医疗到在线银行,实时API让世界变得更美好。不可否认的是,当应用程序和架构发生变化时,攻击面也会随之变化。传统的安全措施,比如WAF、DDoS和Bot防护仍然必不可少&…

uniapp 微信默认地图选点功能实现

效果图 配置项 微信公众平台-小程序配置 uniapp配置 上代码 <template><view class"content"><button click"toMap">请选择位置</button></view> </template><script setup lang"ts">function toMa…

【BUG】已解决:ModuleNotFoundError: No module named ‘torch‘

已解决&#xff1a;ModuleNotFoundError: No module named ‘torch‘ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市…

什么是 std::ios::sync_with_stdio(false)

介绍 std::ios::sync_with_stdio(false) 是 C 中的一个配置设置&#xff0c;用于控制标准 I/O 流&#xff08;如 std::cin, std::cout&#xff09;的行为。这个设置主要用于优化输入输出操作的性能&#xff0c;尤其是在处理大量数据时。 在 C 中&#xff0c;标准流库&#xf…

Langchain[4]:Langchain 0.2革命性突破:结合工具调用与结构化数据处理、@Chain修饰符使用,解决LLM输出难题,提升AI效能

Langchain[4]:Langchain 0.2革命性突破:结合工具调用与结构化数据处理,解决LLM输出难题,提升AI效能 1.工具调用 大型语言模型 (LLM) 可以通过工具调用功能与外部数据源交互。工具调用是一种强大的技术,允许开发人员构建复杂的应用程序,这些应用程序可以利用 LLM 访问、交…