【Redis】一文讲透缓存更新策略与缓存预热、穿透、雪崩、击穿

用Java实现对接豆包ai火山引擎详细版简单明了ai对话 第二部分代码实现。 阅读详情

Redis 缓存策略

数据变更后的处理

当 MySQL 发生新增、修改、删除时,缓存也要跟着处理。常见思路是:

  1. 先修改 MySQL
  2. 删除 Redis 中对应的 key
  3. 下次查询时再按实时生成流程写回 Redis

第二步这里选择“删除缓存”,不直接修改缓存里的值,原因是缓存里的数据可能不是数据库单表字段,可能经过了关联查询、计算、排序、过滤,直接改缓存值容易漏掉逻辑。

如果倒过来,先删缓存再改 MySQL 会出现什么情况呢?单一线程下一般是没有问题的;在并发情况下,可能出现这种顺序:

  1. 线程 A 删除缓存
  2. 线程 B 查询缓存未命中,读取旧 MySQL 数据,并写入 Redis
  3. 线程 A 修改 MySQL

这导致 Redis 里留下的还是旧数据,这类问题后续处理起来会比较麻烦。

缓存更新策略

缓存更新本质上是在处理两个问题:

  • Redis 里应该提前放哪些数据
  • MySQL 数据变化后,Redis 里的旧数据怎么办

定期生成

定期生成就是按固定周期把一批数据写入 Redis,比如每隔一段时间通过 shell / python 脚本从 MySQL 查出热门数据,再写入缓存。

适合场景:

  • 数据变化频率不高
  • 查询量比较大
  • 允许短时间读到旧数据

它的好处是读请求来了以后可以直接查 Redis,请求链路比较短。问题是数据会有延迟,如果 MySQL 已经变了,但下一轮缓存生成还没执行,用户可能读到旧数据。

实时生成

实时生成也就是常见的 Cache Aside 读流程:

  1. 请求查 key,先访问 redis
  2. redis 命中则直接返回;未命中则查 MySQL
  3. MySQL 查询到数据,返回并更新 redis;未查到则直接返回

这种方式不会一开始就把所有数据都放进 Redis,而是用户访问到哪个 key,就把哪个 key 放进去。它适合数据量比较大、热点数据会自然出现的场景。经过一段时间的“动态平衡”,redis 中存储的数据就逐渐成为热点数据了,这又会引出另一个问题:随着时间推移数据越写越多,逐渐达到 redis 的内存上限,旧的热点 key
访问变少了,新的热点 key 插入不进来,此时就要引进内存淘汰策略

注意事项

内存淘汰策略

如果 Redis 内存达到上限,就会触发淘汰策略(这里不一定是物理内存,还可能是 redis 本身的配置文件中规定的最大内存容量)

常见策略有以下几种👇

  • FIFO(First in first out)先进先出
    把缓存中存在时间最久的 key 给删掉
  • LRU(Least recently used)淘汰最久未使用的
    记录每个 key 的最近一次的访问时间,淘汰最近访问时间最老的 key
  • LFU(Least frequently used)淘汰访问次数最少的
    记录每个 key 最近一段时间的访问次数,淘汰访问次数最少的 key
  • Random 随机淘汰
    随机挑选一位幸运儿

缓存预热

redis 服务器首次接入的时候,服务器是没有任何数据的,所有的数据都会访问 MySQL 后再进入 redis,数据库的压力才会慢慢变小。缓存预热就是解决这种问题:它将定期生成和实时生成结合了,通过离线的方式,通过一些统计的途径,先把找到一批热点🔥数据,预先导入到 redis 中,能帮数据库承担一部分访问压力。等后续时间的推移,逐渐就使用新的热点数据来淘汰旧的热点数据

缓存穿透(penetration)

请求查询一个不存在的数据,Redis 没有,MySQL 也没有。每次请求都会打到 MySQL,缓存没有起到保护作用

一部分的原因🌧️

  • 业务设计不合理,缺少必要的参数校验
  • 开发/运维误操作将部分数据从数据库上误删
  • 恶意攻击

常见处理:

  • 缓存空值:MySQL 查不到时,把空结果也写入 Redis,并设置较短过期时间
  • 布隆过滤器:先判断 key 是否可能存在,不可能存在就直接拦截
  • 参数校验:明显非法的 id、页码、业务参数,不进入缓存和数据库查询流程

缓存空值要注意过期时间不能太长,不然真实数据后来被写入 MySQL 时,Redis 里还留着空结果,会让用户继续查不到。

缓存雪崩

在短时间内大量缓存 key 在同一时间失效,或者 Redis 整体不可用,导致缓存的命中率大幅下降,请求集中访问 MySQL,数据库的压力迅速上升,甚至直接宕机了。

出现这种情况的几个典型栗子🌰:

  • redis 突然不可用 / 集群模式下大量节点宕机
  • 某个时间点大量 key 同时过期

处理思路:

  • 给过期时间加随机值,避免大量 key 同一时间失效
  • 对特别核心的数据做缓存预热
  • 对数据库访问加限流,避免请求把 MySQL 打满

缓存雪崩是“大面积缓存同时失效”的问题。沿着这个问题再往下看,会出现一个更具体的场景:不是很多 key 同时失效,而是针对热点 key 失效,大量请求都冲向同一份数据,这就是缓存击穿。

缓存击穿(breakdown)

相当于缓存雪崩的特殊情况,针对热点 key 突然失效时,大量并发请求同时发现 Redis 未命中,大量的请求访问到 MySQL 上

它和缓存雪崩的区别:

  • 缓存雪崩:大量 key 同时失效,影响面大
  • 缓存击穿:一个热点 key 失效,但访问量非常大

常见处理:

  • 热点 key 设置更长的过期时间,或者用逻辑过期控制刷新
  • 进行服务降级,如访问数据库时使用[[分布式锁]] 🔒,限制请求数据库的并发数
基于学术研究风云卫星数据下载教程 目录 一、相关网址 1.登录注册网址:国家卫星气象中心 2.风云数据服务客户端下载网址 3.风云卫星遥感数据服务网址 二、下载数据步骤 1.首先在注册登录网址,注册一个账户 2.待账户审核后,登录账户即可搜索并下载数据 三、相关工具下载 1.登录风云卫星遥感数据服务网址 2.NCSA HDFView软件 3.风云卫星数据(L1)处理软件包(FENGYUN Toolkit v1.1) 4.静止卫星云图分区图显示软件(SECView) 5.风云二号静止气象卫星数据及产品处理.. 阅读详情

相关推荐

带标签的PHM2009齿轮箱数据集

PHM2009附加数据集—带标签的齿轮箱数据集,可用于测试算法

qq_39379705的博客 4872

Redis系列(二十)、缓存穿透、击穿、雪崩、预热、更新、降级

Redis是高性能的分布式内存数据库,对于内存数据库经常会出现下面几种情况,也经常会出现在Redis面试题中:缓存穿透、缓存击穿、缓存雪崩、缓存预热、缓存更新、缓存降级。本篇分别介绍这些概念以及处理方案。

王义凯 的博客 6184

Lossless-Claw 插件实战:告别上下文截断,让 OpenClaw 永不遗忘

本文介绍了OpenClaw的Lossless-Claw插件,这是一个基于LCM论文的DAG摘要系统,能有效解决上下文截断问题。文章包含10个部分,从插件原理到实操指南: 核心原理:通过DAG结构持久化存储所有原始消息,将旧消息分块摘要并形成层级结构,保持上下文在模型Token限制内。 性能优势:在OOLONG基准测试中得分74.8,优于Claude Code的70.3,尤其在长上下文场景表现更佳。 功能特点: 提供lcm_grep、lcm_describe等工具主动回忆历史 摘要始终链接回原文,实现真正无损

u014798858的博客 2616

Redis 缓存穿透、缓存击穿、缓存雪崩

key 对应的数据在redis中并不存在,每次针对此 key的请求从缓存获取不到,请求转发到数据库,访问量大了可能压垮数据库。比如用一个不存在的用户 id 获取用户信息,redis缓存和数据库中都没有,若黑客利用此漏洞进行攻击可能压垮数据库(黑客访问肯定不存在的数据,造成服务器压力大)缓存穿透现象:一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义key 对应的数据存在,但在 redis

长期更新自学笔记 1万+

不同比例尺地质数据共享

包含20w、25w、100w、250w比例尺地质数据共享。

sinat_38828898的博客 2305

Arduino--土壤湿度传感器使用(电阻式)

最近买了一个土壤湿度检测传感器,实物图是这样的: 我买这个模块是想要得到土壤湿度的模拟量。但我买的时候忘了买左边的蓝色模块,我开始以为这个模块是有运放功能的,但实际它是一个电压比较器和一个分压电路。 其模块的接线如图: 该模块的四线是带模拟量输出的,三线的只输出一个到达阈值的标志量。该模块的原理图如下: 该模块的测试原理为:把土壤当成一个可变电阻,随着土壤含水量的增加,土壤电阻减小。而该传感器其实就是两个电极,用来接土壤这个可变电阻。一般湿度的土壤电阻大概在几百K左右,其串连的分压电阻应该在这个数量级。

weixin_41866783的博客 1万+

Redis 缓存策略与缓存穿透、雪崩、击穿的防护方案

Redis 缓存策略的设计,是在缓存命中率、数据一致性和系统复杂度之间做权衡。Cache-Aside 模式实现简单,适合大多数场景;缓存穿透用布隆过滤器或者缓存空值来解决;缓存雪崩用过期时间加随机值来防止;缓存击穿用互斥锁来保护数据库。生产环境中,内存淘汰策略的选择、缓存命中率的监控、以及缓存预热的准备,是把缓存从「能跑」变成「能稳定跑」的三个关键工程细节。缓存不是银弹,但不合理地使用缓存,比不使用缓存更危险。

weixin_63764436的博客 9661

SAP PCC成本收集器实战:从配置到结算的完整流程解析

本文详细解析了SAP PCC成本收集器从配置到结算的完整流程,特别适用于重复制造行业。通过实战案例和配置要点,帮助用户掌握物料分类账管理、成本中心费用归集及差异分析等核心功能,提升企业生产成本控制效率。

weixin_29251567的博客 890

一文彻底分清缓存穿透、缓存击穿、缓存雪崩问题(含记忆技巧)

缓存穿透是指用户请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍。如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大,甚至导致数据库承受不住而宕机崩溃。那么,我们该怎么记忆缓存穿透呢?我们可以这么想,缓存穿透其实就是恶意攻击,就是有人想“穿”过你的防护网(缓存)来“偷”你的家(数据库),这也就是穿透。或者你这样想,有人想恶意攻击你的数据库,这是不是不好的行为,是不是小偷的行为!

胜人者有力,自胜者强! 1万+

国产数据库全解析:openGauss、OceanBase、TiDB与KingbaseES的核心优势与应用场景指南

本文将深入剖析openGauss、OceanBase、TiDB和KingbaseES这四款主流国产数据库的核心内容,并针对国产化过程中给出使用建议,以帮助企业根据自身需求选择合适的数据库解决方案。国产数据库在性能、扩展性、兼容性、安全性等方面展现出强大实力,能够满足不同行业、不同场景的需求。企业在进行国产化过程中,应充分考虑业务特点、技术栈、团队能力等因素,结合上述分析,选择最适合自身的国产数据库产品。随着国产数据库技术的持续发展与生态完善,它们将成为推动企业数字化转型、保障数据安全的重要力量。

java专栏 8779

18-XLINX的XC7A100T的BANK0引脚说明

DXP_0和 DXN_0是纯输入引脚,Xilinx Artix-7 FPGA 内部集成的一个片上监控模数转换器​ 的差分模拟输入对,模数转换器​的模拟信号输入端,将外部的模拟电压​ 采样并转换为内部的数字值,是一个单向的信号采集过程。它是与 VCCADC配对的关键引脚,共同为内部的精密模数转换器提供一个纯净、安静、独立的参考地平面。多FPGA同步配置: 在多FPGA系统中,主FPGA配置完成后,可以拉低从FPGA的 INIT_B使其等待,等所有FPGA都准备好后,再同时释放,实现同步启动。

weixin_44479192的博客 231

Redis | Redis缓存穿透、缓存击穿、缓存雪崩问题及解决方案

目录 缓存问题 1. 缓存穿透---查不到 解决方案 2. 缓存击穿---量太大,缓存过期 解决方案 3. 缓存雪崩 解决方案 缓存问题 1. 缓存穿透---查不到 缓存穿透是指用户想查询一个数据,发现Redis中没有,也就是缓存没有命中,就向持久性数据库发起查询,发现数据库也没有这个数据,于是查询失败了。当用户请求很多的情况下,缓存没有命中,数据库也没有数据,会给数据库造成很大的压力,这就是缓存穿透。 解决方案 第一种解决方案:使用布隆过滤器 使用布隆过滤器之后,将存储

quwenjing_blog 6319

【11】科曼医疗——科曼医疗 嵌入式--面试,校招,面试问答记录

科曼医疗嵌入式校招面试记录:3位面试官分别考察应用层技术、底层技术和HR面。技术问题涵盖C++特性(多态、虚函数、指针与引用区别)、内存管理(malloc与new对比)、嵌入式基础(51最小系统、IIC/SPI协议)及项目经验(智能黑板擦专利项目)。同时考察了Linux使用经验、STM32开发及嵌入式操作系统认知。最后环节应聘者询问了开发环境及面试流程。面试内容全面覆盖嵌入式开发核心知识点。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1248

redis之缓存预热,缓存雪崩,缓存击穿,缓存穿透

Redis 缓存预热是指在系统启动或者缓存失效后,提前将部分数据加载到 Redis 缓存中,以便用户在访问时能够快速获取数据,提高系统性能和响应速度。

qi341500的博客 2459

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Redis 缓存雪崩、穿透、击穿、预热

Redis 缓存雪崩、穿透、击穿、预热

qq_57093716的博客 2144

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Redis的缓存穿透、缓存击穿、缓存雪崩

缓存击穿和缓存雪崩都是与缓存相关的常见问题,它们有一些共同点,并可以采用类似的解决方法。

qq_48595067的博客 7096

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿

缓存是一种临时存储数据的技术,用于在后续请求中快速获取先前检索或计算的数据,从而加速访问速度。在计算机系统中,缓存可以出现在多个层次,包括硬件缓存、操作系统缓存和应用程序级别的缓存。这种机制的基本思想是通过存储一些计算结果或频繁访问的数据,减少对更慢的存储系统(如数据库或磁盘)的访问次数,从而提高系统的性能和响应速度其实缓存是相对的概念比如拿读取速度排序:CPU寄存器 > 内存 > 硬盘 > 网络速度快的设备,可以作为速度慢的设备的缓存最常见的是,使用内存作为硬盘的缓存(redis定位)

dream_ready的博客 1715

【白话Redis】缓存雪崩、穿透、击穿、失效和热点缓存重建

由缓存机器故障宕机,导致大量请求全部落到数据库,超出了数据库的处理能力极限,进而导致数据库压力增大、宕机的情况。大批量请求缓存和数据库中都不存在的数据,导致数据库压力变大,甚至宕机。某个热点key访问非常频繁,且请求时间比较集中,是高并发场景。当这个key失效的瞬间,大量的请求直接落到数据库,导致数据库压力骤增,甚至宕机。

编程探索与数字构建 | Python与Java之旅 1509

redis缓存雪崩、击穿、穿透

Redis 雪崩 是在缓存失效后,大量请求直接打到数据库,导致数据库压力骤增甚至崩溃的问题。在高并发场景下,Redis 雪崩可能会带来严重后果。为了避免 Redis 雪崩,可以采取多种措施,如 缓存预热、设置不同过期时间、使用互斥锁防止缓存击穿、缓存降级、限流与熔断机制 等。持久化与集群 是提升 Redis 可用性的关键,确保即便在单个节点失效的情况下,服务依然能够正常工作。缓存穿透:缓存和数据库中都没有的数据,可用户还是源源不断的发起请求,导致每次请求都会到数据库,从而压垮数据库。

weixin_43539296的博客 2263

Redis异常问题解决方案:缓存雪崩、预热、穿透、击穿、降解方案分析

不管你在工作中还是面试中,Redis异常问题的解决方案都是不得不去学习了解的,下面来细品一下! 一、缓存雪崩 1、什么是缓存雪崩? 如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩由于原有缓存失效,新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。 举例来说, 我们在准备一项抢...

求关注 3056

Redis 缓存深度解析:穿透、击穿、雪崩与预热的全面解读

存储数据 (内存型数据库)缓存 (最常用的场景)消息队列 (使用比较少)缓存的作用就是让我们能够更快地获取到数据 , 一般来说速度快的设备可以给速度慢的设备去做缓存 .对于硬件的访问速度来说 , 通常情况下是这样的 : CPU 寄存器 > 内存 > 硬盘 > 网络比较常见的是使用内存来去作为硬盘的缓存 (Redis) , 甚至我们也可以使用硬盘来去作为网络的缓存。

m0_53117341的博客 1312

Redis缓存预热、缓存穿透、缓存击穿、缓存雪崩,Redis布隆过滤器怎么实现?

Redis缓存预热是指在服务器启动或应用程序启动之前,将一些数据先存储到Redis中,以提高Redis的性能和数据一致性。这可以减少服务器在启动或应用程序启动时的数据传输量和延迟,从而提高应用程序的性能和可靠性。

学Java,找哪吒 2450

Redis缓存之预热、击穿、穿透、雪崩

Redis缓存之预热、击穿、穿透、雪崩

qq_26641137的博客 1238

Redis中缓存穿透、击穿、雪崩以及解决方案

Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)和有序集合(sorted sets)等。

2301_77899321的博客 1965

redis缓存穿透、雪崩与击穿

在分布式系统中,缓存的引入旨在减少数据库的访问压力,提升数据读取速度。然而,缓存的高效运作需要避免一些潜在问题的干扰。缓存作为提升系统性能的重要手段,其正确的设计和管理对系统的稳定性和高效性至关重要。本文详细探讨了Redis在分布式系统中常见的三大缓存问题——缓存穿透、缓存雪崩与缓存击穿,并介绍了相应的解决方案和Java代码实现。通过布隆过滤器、随机过期时间和互斥锁等技术手段,可以有效应对这些挑战,确保缓存系统的稳定运行。

Flying_Fish_roe的博客 1470

Redis高阶6-预热、雪崩、击穿、穿透问题

​ 缓存预热是一种在程序启动或之后,主动将热点数据加载到缓存中的策略。这样,在实际请求到达程序时,热点数据已经存在于缓存中,从而减少了缓存穿透和缓存击穿的情况,也缓解了SQL服务器的压力。

sdrfghb的博客 1224
上一篇: 【Redis】主从复制局限性与哨兵概念、Docker 部署教程
下一篇: 【Redis】Docker 部署集群补充说明
Jul1en_
博客等级 码龄2年 275粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值