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

news2024/9/22 7:36:29

缓存雪崩

缓存雪崩指的是大量缓存数据在同一时间失效,导致所有请求直接打到数据库或下游系统,造成数据库瞬时压力剧增,甚至可能引发系统崩溃。

形成原因:

  • 缓存数据同时过期:由于缓存过期时间设置不合理,导致大量缓存同时失效,所有请求直接落到数据库。
  • 缓存服务器宕机:缓存服务本身发生故障,无法响应请求,所有请求直接到数据库。

假设你有一个热门商品页面,所有缓存的商品数据过期时间相同,比如都设定为 12 小时。当 12 小时一到,所有缓存失效,用户请求打到数据库,数据库承受巨大压力,甚至可能导致崩溃。

缓存雪崩的避免方案

缓存过期时间设置随机化

为每个缓存的键设置不同的过期时间,避免大批量缓存同时失效。可以在原有过期时间的基础上,添加一个随机值(如 1-5 分钟的随机过期时间)。

缓存雪崩的解决方案

1. 限流降级

在发生缓存雪崩时,使用限流机制,限制进入数据库的请求数量。同时可以启用降级策略,例如返回默认数据或空数据来保证系统的可用性。

2. 缓存预热

在系统启动或缓存即将过期时,提前加载常用的数据到缓存中,避免缓存失效后瞬间打爆数据库。这种方式可以通过定时任务来实现。

缓存穿透

缓存穿透 指的是用户请求的数据根本不在缓存和数据库中,导致每次请求都直接查询数据库。即使我们把不存在的数据存入缓存,依然没有命中缓存,从而让缓存失效。

形成原因:

  • 用户恶意请求一些不存在的数据,缓存中没有,数据库也查不到,每次查询都打到数据库,造成数据库负载过大。

如果用户不断请求数据库中不存在的 id,比如负数 id=-1 或很大范围的 id 值,而系统没有处理此类非法请求,导致这些请求每次都穿过缓存直达数据库。

缓存穿透的解决方案

1. 使用布隆过滤器

布隆过滤器(Bloom Filter)是一种空间高效的概率性数据结构,可以快速判断某个数据是否存在。对于不存在的请求,在查询数据库之前先通过布隆过滤器检查是否有该记录,避免穿透到数据库。

2. 缓存空对象

对于查询结果为 null 的数据,直接缓存一个空值,并设置较短的过期时间(如 5 分钟),避免短时间内重复查询这些不存在的数据。

缓存击穿

缓存击穿 指的是某个热点数据在缓存失效的瞬间,有大量并发请求同时到达这个数据,由于缓存过期,这些请求直接打到数据库,导致数据库负载激增。

形成原因:

  • 某些热门数据(热点 key)过期时间到达,但此时有大量并发请求请求这个数据,由于缓存失效,所有请求都会查询数据库,形成短时间内的高并发。

假设你有一个热门商品 id=100 的缓存,在缓存失效时(比如设定 5 分钟后过期),恰好有成千上万的用户访问这个商品。由于缓存失效,所有请求都会同时打到数据库,造成数据库压力激增。

缓存击穿的解决方案

1、缓存热点数据

对于热点数据,可以设置较长的过期时间,或者让这些数据不过期,定期主动更新缓存,避免过期时产生缓存击穿。

2、使用互斥锁(分布式锁)

在缓存失效的瞬间,为第一个请求的线程加锁,只有获取到锁的线程可以访问数据库并更新缓存,其他线程等待缓存更新后再读取缓存,避免数据库被并发请求打爆。

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

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

相关文章

(done) 声音信号处理基础知识(2) (重点知识:pitch)(Sound Waveforms)

来源:https://www.youtube.com/watch?vbnHHVo3j124 复习物理知识: 声音由物体的振动产生 物体振动会导致空气分支振荡 某一处的空气气压变化会创造一个波 声音是机械波 空气的振荡在空间中传递 能量从空间中的一个点到另一个点 机械波需要媒介&#x…

LabVIEW编程能力如何能突飞猛进

要想让LabVIEW编程能力实现突飞猛进,需要采取系统化的学习方法,并结合实际项目进行不断的实践。以下是一些提高LabVIEW编程能力的关键策略: 1. 扎实掌握基础 LabVIEW的编程本质与其他编程语言不同,它是基于图形化的编程方式&…

【Taro】初识 Taro

笔记来源:编程导航。 概述 Taro 官方文档:https://taro-docs.jd.com/docs/ (跨端开发框架) Taro 官方框架兼容的组件库: taro-ui:https://taro-ui.jd.com/#/ (最推荐,兼容性最好&…

第四范式发布AIGS Builder企业级软件重构助手,以生成式AI重构企业软件

产品上新 Product Release 今天,第四范式发布企业级软件重构助手——AIGS Builder,可快速重构软件交互体验。传统的企业软件开发,每次迭代通常要以月计。基于第四范式AIGS Builder大模型,用生成式Agent替代复杂的界面,…

为什么 AVIF 将成为下一代图片格式之王

AVIF的卓越优势 AVIF(AV1 Image File Format)正在迅速崛起,成为下一代网络图片格式的有力竞争者。作为基于AV1视频编码技术的图像格式,AVIF在多个方面展现出了令人瞩目的性能。 1. 卓越的压缩效率 与JPEG和WebP相比&#xff0c…

torch模型量化方法总结

0.概述 模型训练完成后的参数为float或double类型,而装机(比如车载)后推理预测时,通常都会预先定点(量化)为int类型参数,相应的推理的精度会有少量下降,但不构成明显性能下降&#…

CO-锁存器(Latch)

1.描述 锁存器(Latch),是数字电路中的一种具有记忆功能的逻辑元件,是一种对脉冲电平敏感的存储单元电路,可以在特定输入脉冲电平作用下改变状态,利用电平控制数据的输入,包括不带使能控制的锁存器和带使能控制的锁存器…

sql执行流程经典案例分析

现在有联合索引(a,b),select* form tb where b xx group by a执行流程是什么样子的? CREATE TABLE IF NOT EXISTS test(id INT(10) NOT NULL AUTO_INCREMENT COMMENT主键,a INT(10) NULL,b INT(10) NULL,PRIMARY KEY(id),INDEX idx_a_b(a,b))ENGINE INNODB;INSERT INTO test…

【Unity-UGUI组件拓展】| Image 组件拓展,支持FIlled和Slice功能并存

🎬【Unity-UGUI组件拓展】| Image 组件拓展,支持FIlled和Slice功能并存一、组件介绍二、组件拓展方法三、完整代码💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏…

Linux:login shell和non-login shell以及其配置文件

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 shell是Linux与外界交互的程序,登录shell有两种方式,login shell与non-login shell,它们的区别是读取的配置文件不同,本…

TypeScript入门 (三)数据类型

引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的TypeScript学习总结文档。本文旨在全面介绍 TypeScript 中的各种数据类型,帮助读者深入理解每种数据类型的用法、内置属性…

LabVIEW提高开发效率技巧----自动化测试和持续集成

在大型项目中,自动化测试和持续集成是提高开发效率和代码质量的关键手段。通过这些技术,开发者能够在开发的早期阶段快速发现问题,减少后期调试的工作量,并且能够确保代码的稳定性和可维护性。以下是这两个概念如何在LabVIEW开发中…

Docker Networking Tutorial (Bridge - None - Host - IPvlan - Macvlan )

In this article, We will talk about the network of docker. Therere have five types of docker network. 一、Bridge The default network of docker network type. You can use : docker network ls docker network create --driver bridge my_bridge_network ##The CID…

什么是 GPT?通过图形化的方式来理解 Transformer 架构

Predict, sample, repeat 预测、取样、重复 GPT 是 Generative Pre-trained Transformer 的缩写。首个单词较为直接,它们是用来生成新文本的机器人。“Pre-trained” 指的是模型经历了从大量数据中学习的过程,这个词暗示了该模型还有进一步在特定任务中…

移动技术开发:ListView水果列表

1 实验名称 ListView水果列表 2 实验目的 掌握自定义ListView控件的实现方法 3 实验源代码 布局文件代码&#xff1a; activity_main.xml: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.androi…

Java 中Lock接口锁的使用

一. Lock接口下的实现类 在Java中&#xff0c;Lock 接口是 java.util.concurrent.locks 包中的一部分&#xff0c;它提供了比 synchronized 更丰富的锁操作。Lock 接口的实现类包括 ReentrantLock&#xff08;可重入锁&#xff09;、ReadWriteLock&#xff08;读写锁&#xff…

从零开始学习TinyWebServer

写在前面 项目参考&#xff1a;https://github.com/qinguoyi/TinyWebServer 写作框架/图参考&#xff1a;https://blog.csdn.net/qq_52313711/article/details/136356042?spm1001.2014.3001.5502 原本计划是&#xff0c;先将项目代码大概看一遍&#xff0c;然后再着手实现一下…

【hot100-java】【组合总和】

R8-回溯篇 印象题&#xff0c;很基本的回溯 class Solution {void backtrack(List<Integer> state,int target,int[] choices,int start,List<List<Integer>> ret){//子集和等于target&#xff0c;记录解if (target0){ret.add(new ArrayList<>(state)…

LeetCode讲解篇之1343. 大小为 K 且平均值大于等于阈值的子数组数目

文章目录 题目描述题解思路题解代码 题目描述 题解思路 题目让我们求长度为k的子数组并且该子数组的平均值大于threshold&#xff0c;对于这题&#xff0c;我们可以考虑维护一个长度为k的窗口&#xff0c;窗口不断向右滑动&#xff0c;遍历所有长度为k的子数组&#xff0c;我们…

低版本SqlSugar的where条件中使用可空类型报语法错误

SQLServer数据表中有两列可空列&#xff0c;均为数值类型&#xff0c;同时在数据库中录入测试数据&#xff0c;Age和Height列均部分有值。   使用SqlSugar的DbFirst功能生成数据库表类&#xff0c;其中Age、Height属性均为可空类型。   开始使用的SqlSugar版本较低&…