Redis 缓存穿透、击穿、雪崩 的区别与解决方案

前言

Redis 是一个高性能的键值数据库,广泛应用于缓存、会话存储、实时数据分析等场景。然而,在高并发的环境下,Redis 缓存可能会遇到 缓存击穿缓存穿透缓存雪崩 这三大问题。这些问题不仅影响系统的稳定性和性能,还经常出现在面试题中,值得我们深入了解🤏。


1. 缓存穿透

定义

缓存穿透指的是查询一个不存在的数据时,缓存层和数据库层都会返回空结果,导致每次请求都直接访问数据库,从而失去缓存的加速作用,增加数据库的负担。

穿透”可以简单的理解为:缓存和数据库都不存在要查询的数据,请求直接“穿透”了缓存。

场景

例如:用户请求一个不存在的商品ID,由于缓存和数据库中都没有该商品的信息,请求直接穿透到数据库,增加数据库的压力。

解决方案

  1. 布隆过滤器
    使用布隆过滤器缓存不存在的请求,避免每次都查询数据库。布隆过滤器可以高效判断某个元素是否在集合中,减少不必要的数据库查询。

  2. 缓存空值
    当查询结果为空时,可以将空值缓存一段时间(如 1-5 分钟),避免频繁穿透。这样即使请求再次到来,也能从缓存中返回空值,减少数据库查询。

流程图

用户请求不存在的数据
检查缓存
缓存未命中
检查数据库
返回空结果
缓存空值
减少数据库负载

2. 缓存击穿

定义

缓存击穿是指缓存中的某些数据在失效后,大量请求同时访问该数据,导致所有请求直接穿透到数据库,增加数据库压力,甚至可能导致数据库崩溃。

击穿”可以简单的理解为:缓存不存在,但是数据库存在要查询的数据,请求直接“击穿”了缓存。

场景

例如:某个商品详情数据在缓存中过期,多个用户同时请求该商品数据,由于缓存失效,这些请求直接访问数据库,造成数据库负载骤增。

解决方案

  1. 互斥锁
    在缓存失效时,使用分布式锁确保只有一个请求访问数据库并更新缓存,其余请求等待缓存更新完毕后再从缓存中获取数据,避免同时访问数据库。

  2. 缓存预热
    在系统启动时,提前将常用数据加载到缓存中,减少缓存失效的概率,确保热点数据一直在缓存中。

  3. 合理的缓存失效时间
    根据数据访问频率和业务需求合理设定缓存过期时间,避免过短的失效时间引起频繁的缓存更新和数据库访问。

流程图

用户请求数据
检查缓存
缓存失效
检查数据库
返回数据
更新缓存
后续请求直接访问缓存

3. 缓存雪崩

定义

缓存雪崩是指大量缓存数据在同一时间失效,导致大量请求同时访问数据库,给数据库带来巨大压力,甚至可能导致数据库崩溃。

雪崩”可以简单的理解为:大量缓存同一时间失效,缓存“雪崩”了。

场景

例如:大量缓存数据设置了相同的过期时间,所有缓存数据在某一时刻失效,导致大量请求同时访问数据库,可能引发雪崩效应。

解决方案

  1. 错开缓存过期时间
    在缓存过期时间上增加随机偏移量,错开过期时间,减少缓存同时过期的情况。

  2. 使用永久缓存
    对于不经常变化的数据,可以使用永久缓存,避免频繁失效,减少数据库访问。

  3. 降级处理
    当缓存系统发生故障时,启用降级机制,将部分请求转发至备用缓存或返回默认值,减轻数据库压力。

流程图

多个缓存项过期
多个用户请求同时访问数据库
访问数据库
数据库返回数据
更新缓存
后续请求直接访问缓存

总结

  • 缓存穿透:查询数据时 缓存和数据库都不存,使用 布隆过滤器缓存空值 避免每次都访问数据库。
  • 缓存击穿:查询数据时 缓存不存在,数据库存在,使用 互斥锁缓存预热合理的过期时间 解决。
  • 缓存雪崩:查询数据时 大量缓存同一时间失效,通过 错开缓存过期时间使用永久缓存降级处理 应对。

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

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

相关文章

【k8s面试题2025】3、练气中期

体内灵气的量和纯度在逐渐增加。 文章目录 在 Kubernetes 中自定义 Service端口报错常用控制器Kubernetes 中拉伸收缩副本失效设置节点容忍异常时间Deployment 控制器的升级和回滚日志收集资源监控监控 Docker将 Master 节点设置为可调度 在 Kubernetes 中自定义 Service端口报…

数智化转型 | 星环科技Defensor 助力某银行数据分类分级

在数据驱动的金融时代,数据安全和隐私保护的重要性日益凸显。某银行作为数字化转型的先行者,面临着一项艰巨的任务:如何高效、准确地对分布在多个业务系统、业务库与数仓数湖中的约80万个字段进行数据分类和分级。该银行借助星环科技数据安全…

mac配置 iTerm2 使用lrzsz与服务器传输文件

mac配置 1. 安装支持rz和sz命令的lrzsz brew install lrzsz2. 下载iterm2-send-zmodem.sh和iterm2-recv-zmodem.sh两个脚本 # 克隆仓库 git clone https://github.com/aikuyun/iterm2-zmodem ~/iterm2-zmodem# 进入到仓库目录 cd ~/iterm2-zmodem# 设置脚本文件可执行权限 c…

redis 分布式重入锁

文章目录 前言一、分布式重入锁1、单机重入锁2、redis重入锁 二、redisson实现重入锁1、 添加依赖2、 配置 Redisson 客户端3、 使用 Redisson 实现重入锁4、 验证5、运行项目 三、redisson分布式锁分析1、获取锁对象2、 加锁3、订阅4、锁续期5、释放锁6、流程图 前言 通过前篇…

【git】如何删除本地分支和远程分支?

1.如何在 Git 中删除本地分支 本地分支是您本地机器上的分支,不会影响任何远程分支。 (1)在 Git 中删除本地分支 git branch -d local_branch_name git branch 是在本地删除分支的命令。-d是一个标志,是命令的一个选项&#x…

关于 Cursor 的一些学习记录

文章目录 1. 写在最前面2. Prompt Design2.1 Priompt v0.1:提示设计库的首次尝试2.2 注意事项 3. 了解 Cursor 的 AI 功能3.1 问题3.2 答案 4. cursor 免费功能体验5. 写在最后面6. 参考资料 1. 写在最前面 本文整理了一些学习 Cursor 过程中读到的或者发现的感兴趣…

使用python+pytest+requests完成自动化接口测试(包括html报告的生成和日志记录以及层级的封装(包括调用Json文件))

一、API的选择 我们进行接口测试需要API文档和系统,我们选择JSONPlaceholder免费API,因为它是一个非常适合进行接口测试、API 测试和学习的工具。它免费、易于使用、无需认证,能够快速帮助开发者模拟常见的接口操作(增、删、改、…

【Rust自学】13.2. 闭包 Pt.2:闭包的类型推断和标注

13.2.0. 写在正文之前 Rust语言在设计过程中收到了很多语言的启发,而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。 在本章中,我们会讨论 Rust 的一…

无人机技术架构剖析!

一、飞机平台系统 飞机平台系统是无人机飞行的主体平台,主要提供飞行能力和装载功能。它由机体结构、动力装置、电气设备等组成。 机体结构:无人机的机身是其核心结构,承载着其他各个组件并提供稳定性。常见的机身材料包括碳纤维、铝合金、…

Axios封装一款前端项目网络请求实用插件

前端项目开发非常经典的插件axios大家都很熟悉,它是一个Promise网络请求库,可以用于浏览器和 node.js 支持的项目中。像一直以来比较火的Vue.js开发的几乎所有项目网络请求用的都是axios。那么我们在实际的项目中,有时候为了便于维护、请求头…

【c++继承篇】--继承之道:在C++的世界中编织血脉与传承

目录 引言 一、定义二、继承定义格式2.1定义格式2.2继承关系和访问限定符2.3继承后子类访问权限 三、基类和派生类赋值转换四、继承的作用域4.1同名变量4.2同名函数 五、派生类的默认成员构造函数5.1**构造函数调用顺序:**5.2**析构函数调用顺序:**5.3调…

LDD3学习8--linux的设备模型(TODO)

在LDD3的十四章,是Linux设备模型,其中也有说到这个部分。 我的理解是自动在应用层也就是用户空间实现设备管理,处理内核的设备事件。 事件来自sysfs和/sbin/hotplug。在驱动中,只要是使用了新版的函数,相应的事件就会…

Python基于Django的图像去雾算法研究和系统实现(附源码,文档说明)

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

Python爬虫(5) --爬取网页视频

文章目录 爬虫爬取视频 指定url发送请求 UA伪装请求页面 获取想要的数据 解析定位定位音视频位置 存放视频完整代码实现总结 爬虫 Python 爬虫是一种自动化工具,用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持(如…

从AI原理到模型演进及代码实践 的学习二

参考:全面解析:从AI原理到模型演进及代码实践-CSDN博客 训练过程 Transformer仅一个Encoder模块就可以工作,可以处理信息抽取、识别、主体识别等任务,比如 BERT(Bidirectional Encoder Representations from Transfor…

利用EXCEL进行XXE攻击

0X00 前言 CTF 选手都清楚我们像 word 文档格式改成 zip 格式后,再解压缩可以发现其中多数是描述工作簿数据、元数据、文档信息的 XML 文件。实际上,与所有 post-Office 2007 文件格式一样,现代 Excel 文件实际上只是 XML 文档的 zip 文件。…

在Mac mini上实现本地话部署AI和知识库

在Mac mini上实现本地话部署AI和知识库 硬件要求:大模型AI,也叫LLM,需要硬件支持,常见的方式有2种:一种是采用英伟达之类支持CUDA库的GPU芯片或者专用AI芯片;第二种是采用苹果M系列芯片架构的支持统一内存架…

鸿蒙UI(ArkUI-方舟UI框架)-开发布局

文章目录 开发布局1、布局概述1)布局结构2)布局元素组成3)如何选择布局4)布局位置5)对子元素的约束 2、构建布局1)线性布局 (Row/Column)概述布局子元素在排列方向上的间距布局子元素在交叉轴上的对齐方式(…

指针的进阶

指针的主题,我们在初级阶段的《指针》章节已经接触过了,我们知道了指针的概念: 1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 2. 指针的大小是固定的4/8个字节(32位平台/64位平台&#xff0…

B站评论系统的多级存储架构

1. 背景 评论是 B站生态的重要组成部分,涵盖了 UP 主与用户的互动、平台内容的推荐与优化、社区文化建设以及用户情感满足。B站的评论区不仅是用户互动的核心场所,也是平台运营和用户粘性的关键因素之一,尤其是在与弹幕结合的情况下&#xf…