缓存雪崩、缓存穿透【Redis】

目录

缓存雪崩

一、产生原因

二、解决方案

缓存穿透

一、产生原因

二、解决方案


缓存雪崩

Redis缓存雪崩是指在系统高并发情况下,Redis缓存中的大量数据集中失效,导致系统的连续错误请求,进而造成数据库的过载和系统的崩溃。以下是对Redis缓存雪崩的详细解释:

一、产生原因

  1. 缓存数据过期时间设置过于接近:当大量的缓存数据设置了相同的过期时间,或者过期时间非常接近时,这些缓存数据可能会在同一时刻失效,从而导致缓存雪崩。
  2. 缓存服务器故障或宕机:如果Redis缓存服务器出现故障或宕机,那么缓存层将无法正常提供服务,所有的请求都会直接到达存储层,从而引发缓存雪崩。
  3. 系统访问高峰期:在系统访问高峰期,大量的请求可能会同时涌入Redis缓存,如果此时缓存层无法有效处理这些请求,也可能导致缓存雪崩。

二、解决方案

  1. 设置合理的缓存失效时间:合理设置缓存的过期时间,让缓存的失效时间分布在一个时间轴上,避免大量的缓存在同一时间失效。可以在原有失效时间的基础上增加一个随机值,如1~5分钟的随机范围,使每个缓存过期时间的重复率降低。
  2. Redis数据的热备份:通过将缓存数据备份到其他Redis实例中,当某个Redis实例发生故障或宕机时,可以快速切换到备份实例,保证系统的正常运行。
  3. 限流和降级:通过限制系统的访问流量,防止系统瞬时的高并发访问。同时,可以通过降级策略,如提供默认数据或静态页面等,来减轻系统的负载压力,保证系统的稳定性。
  4. 缓存预热:在系统上线之前,可以提前将热点数据加载到缓存中,以降低对数据库的访问压力。通过缓存预热可以尽可能减少缓存失效带来的冷启动问题,减轻雪崩的影响。
  5. 使用分布式缓存:将缓存数据分散存储在多个Redis实例中,避免单个Redis实例的故障引发雪崩问题。通过使用一致性哈希算法等技术,将缓存数据均匀地分布到多个节点上,提高系统的容错性和稳定性。
  6. 高可用性设计:使用Redis哨兵模式或Redis集群部署方式,确保缓存层的高可用性。即使个别Redis节点或机房宕掉,整个缓存层仍然可以使用。
  7. 互斥锁控制:在高并发场景下,为了避免大量的请求同时到达存储层查询数据、重建缓存,可以使用互斥锁控制。当缓存未命中时,对key加锁,然后从存储层查询数据并写入缓存层,最后释放锁。若其他线程获取锁失败,则让线程休眠一段时间后重试。

缓存穿透

Redis缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致每次请求都会直接访问数据库,进而可能给数据库带来巨大压力的现象。以下是对Redis缓存穿透的详细解释:

一、产生原因

  1. 数据不存在:当客户端请求的数据在缓存中和数据库中都不存在时,这些请求会绕过缓存直接到达数据库,导致数据库压力增大。
  2. 恶意攻击:攻击者可能会故意请求系统中不存在的数据,利用缓存穿透来消耗数据库资源,进而达到攻击目的。

二、解决方案

  1. 缓存空值

    • 对于查询结果为空的操作,可以将空结果缓存起来(通常设置一个较短的过期时间)。
    • 这样,当相同的请求再次到来时,可以直接从缓存中获取空结果,避免访问数据库。
    • 但需要注意,如果短时间内存在大量恶意请求,这种策略可能会导致缓存系统占用大量内存。因此,可以结合风控系统对用户请求进行统计和封禁。
  2. 布隆过滤器

    • 布隆过滤器是一种数据结构,用于快速判断一个元素是否存在于一个集合中。
    • 它通过多个哈希函数将元素映射到位数组上的多个位置,如果所有位置的值都为1,则认为元素存在;如果存在任一位置的值为0,则认为元素不存在。
    • 使用布隆过滤器可以在查询数据库之前快速判断数据是否存在,从而避免不必要的数据库访问。
    • 但需要注意的是,布隆过滤器存在一定的误判率,即可能会将不存在的元素误判为存在。因此,在设置布隆过滤器时需要根据实际情况调整其参数以降低误判率。
  3. 使用锁机制

    • 当发现缓存不存在时,可以使用锁机制来避免多个相同的请求同时访问数据库。
    • 只有一个请求会获得锁并查询数据库,其他请求会等待锁释放后再访问缓存或数据库。
    • 这种策略可以确保在数据库查询期间不会有其他请求重复访问数据库,从而减轻数据库压力。
    • 但需要注意的是,如果锁持有时间过长或锁释放不及时,可能会导致其他请求长时间等待甚至死锁。因此,需要合理设置锁的持有时间和释放策略。
  4. 组合方案

    • 在实际应用中,可以结合多种策略来解决缓存穿透问题。
    • 例如,可以先使用布隆过滤器进行初步筛选,如果数据不存在则直接返回失败;如果数据可能存在但缓存中不存在,则使用锁机制确保只有一个请求访问数据库;最后,将查询结果(无论是否为空)都缓存起来以供后续请求使用。

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

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

相关文章

Java 调用 MULTIPART_FORM_DATA 接口

以 QAnthing 上传文件(POST)接口为例,展示Java如何调用上传文件接口。 接口文档如下: QAnthign接口文档地址 编码 RestTemplate 版 /** * * param url 接口地址 * param filePath 文件本地路径 */ public void uploadFile(S…

Vue3-小兔鲜项目出现问题及其解决方法(未写完)

基础操作 (1)使用create-vue搭建Vue3项目 要保证node -v 版本在16以上 (2)添加pinia到vue项目 npm init vuelatest npm i pinia //导入creatPiniaimport {createPinia} from pinia//执行方法得到实例const pinia createPinia()…

【Vue】 npm install amap-js-api-loader指南

前言 项目中的地图模块突然打不开了 正文 版本太低了,而且Vue项目就应该正经走项目流程啊喂! npm i amap/amap-jsapi-loader --save 官方说这样执行完,就这结束啦!它结束了,我还没有,不然不可能记录这篇文…

C#桌面应用制作计算器进阶版01

基于C#桌面应用制作计算器做出了少量改动,其主要改动为新增加了一个label控件,使其每一步运算结果由label2展示出来,而当点击“”时,最终运算结果将由label1展示出来,此时label清空。 修改后运行效果 修改后全篇代码 …

Linux下Intel编译器oneAPI安装和链接MKL库编译

参考: https://blog.csdn.net/qq_44263574/article/details/123582481 官网下载: https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit-download.html?packagesoneapi-toolkit&oneapi-toolkit-oslinux&oneapi-linoffline 填写邮件和国家,…

文件管理 IV(文件系统)

一、文件系统结构 文件系统(File system)提供高效和便捷的磁盘访问,以便允许存储、定位、提取数据。文件系统有两个不同的设计问题:第一个问题是,定义文件系统的用户接口,它涉及定义文件及其属性、所允许的…

基于ToLua的C#和Lua内存共享方案保姆级教程

C#和Lua内存共享方案保姆级教程 前言 在介绍C#和Lua内存共享方案之前,先介绍下面两个点来支撑这个方案的必要性 跨语言交互很费 Lua和C#交互最早是基于反射的方式实现的,后来为了提升性能发展成Luajit+C#静态方法导出注入到lua虚拟机的方式至此Lua+Unity的性能才达到了实…

详细描述一下Elasticsearch索引文档的过程?

大家好,我是锋哥。今天分享关于【详细描述一下Elasticsearch索引文档的过程?】面试题。希望对大家有帮助; 详细描述一下Elasticsearch索引文档的过程? Elasticsearch的索引文档过程是其核心功能之一,涉及将数据存储到…

SpringBoot学习记录(六)配置文件参数化

SpringBoot学习记录(六)配置文件参数化 一、参数提取到配置文件中二、yml配置文件三、ConfigurationProperties注解实现批量属性注入 一、参数提取到配置文件中 定义在代码中的参数的值分散在各个不同的文件中,不便于后期维护管理&#xff0…

# ubuntu 安装的pycharm不能输入中文的解决方法

ubuntu 安装的pycharm不能输入中文的解决方法 一、问题描述: 当在 ubuntu 系统中,安装了 pycharm(如:pycharm2016, 或 pycharm2018),打开 pycharm 输入代码时,发现不能正常输入中文,安装的搜狗…

NLP论文速读(CVPR 2024)|使用DPO进行diffusion模型对齐

论文速读|Diffusion Model Alignment Using Direct Preference Optimization 论文信息: 简介: 本文探讨的背景是大型语言模型(LLMs)通过人类比较数据和从人类反馈中学习(RLHF)的方法进行微调,以…

<OS 有关> ubuntu 24 不同版本介绍 安装 Vmware tools

原因 想用 apt-get download 存到本地 / NAS上,减少网络流浪。 看到 VMware 上的确实有 ubuntu,只是版本是16。 ubuntu 版本比较:LTS vs RR LTS: Long-Term Support 长周期支持, 一般每 2 年更新,会更可靠与更稳定…

泛微E9与金蝶云星空的集成方案:实现审批流程与财务管理的无缝对接

泛微E9与金蝶云星空的集成方案:实现审批流程与财务管理的无缝对接 背景介绍: 在企业日常运营中,泛微OA-E9和金蝶云星空是两个关键的系统。泛微OA-E9是一款广受企业青睐的办公自动化软件,它通过流程管理、文档管理、协同办公等模…

Redis最终篇分布式锁以及数据一致性

在前三篇我们几乎说完了Redis的所有的基础知识以及Redis怎么实现高可用性,那么在这一篇文章中的话我们主要就是说明如果我们使用Redis出现什么问题以及解决方案是什么,这个如果在未来的工作中也有可能会遇到,希望对看这篇博客的人有帮助,话不多说直接开干 一.Hotkey以及BigKey…

GPT中转站技术架构

本文介绍阿波罗AI中转站(https://api.ablai.top/)的技术架构,该中转API的技术架构采用了分布式架构、智能调度和API中转等技术,确保了全球范围内的高效访问和稳定运行。以下是对该技术架构的详细分析: 分布式架构 分…

【强化学习的数学原理】第02课-贝尔曼公式-笔记

学习资料:bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接:强化学习的数学原理 西湖大学 赵世钰 文章目录 一、为什么return重要?如何计算return?二、state value的定义三、Bellman公式的详细推导四、公式向量形式…

[less] Operation on an invalid type

我这个是升级项目的时候遇到的,要从 scss 升级到 less,然后代码中就报了这个错误 我说一下代码的错误过程,但是这里没有复现,因为我原本报错的代码要复杂很多,而且是公司代码,不方便透露,这是我…

ssm面向品牌会员的在线商城小程序

摘要 随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化,网络化和电子化。它将是直接管理面向品牌会员的在线商城小程序的最新形式。本小程序是以面向品牌会员的在线商城管理为目标,使用 java技术制…

国土变更调查拓扑错误自动化修复工具的研究

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、拓扑错误的形成原因 1.边界不一致 2.不规则图形 3.尖锐角 4.局部狭长 5.细小碎面 6.更新层相互重叠 二、修复成果展示 1.边界不一致 2.不规则图形 3.尖锐角 4.局部狭…

WPS 加载项开发说明wpsjs

wpsjs几个常用的CMD命令: 1.打开cmd输入命令测试版本号 npm -v 2.首次安装nodejs,npm默认国外镜像,包下载较慢时,可切换到国内镜像 //下载速度较慢时可切换国内镜像 npm config set registry https://registry.npmmirror.com …