【Redis入门笔记 09】缓存穿透、击穿与雪崩

news2025/4/8 23:35:12

redis

目录

    • 🍉缓存穿透
    • 🍓缓存击穿
    • 🍑缓存雪崩

☕前言:

Redis 数据库常常用来充当传统数据库的缓存。一个实际的场景是当用户的请求过来,先去查缓存中的数据,如果缓存中不存在,则再去查询数据库,如果数据在数据库中存在,则将数据放入缓存然后返回,如果数据库中也不存在,则直接返回失败。

redis

大部分情况下,加缓存是为了减轻数据库的压力,提升系统的性能。但是如果使用不好,它也会带来很多意想不到的问题,我们经常说的三个问题分别是缓存穿透、缓存击穿与缓存雪崩。


🍉缓存穿透

🏄‍♂️什么是缓存穿透?

如果有大量的查询请求,并且查询的 key 对应的数据在数据库中并不存在,每次针对此 key 的请求在缓存中获取不到,请求会转到数据库上,从而可能会导致数据库挂掉。

1

🏄‍♂️解决方案:

  1. 缓存空值: 如果一个查询返回的数据为空(不管是数据是否存在),我们仍然把这个空结果(null)进行缓存,并且设置一个较短的过期时间。
  2. 设置可访问的名单: 使用 BitMaps 类型定义一个可以访问的名单,名单 id 作为 BitMaps 的偏移量,每次访问和 BitMaps 里面的 id 进行比较,如果访问 id 不在 BitMaps 里面,进行拦截,不允许访问。
  3. 采用布隆过滤器: 布隆过滤器 (Bloom Filter)是由 Burton Howard Bloom 于 1970 年提出,它是一种 space efficient 的概率型数据结构,用于判断一个元素是否在集合中。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数),它的效率要远高于一般的算法,但是有一定的误识别率。当布隆过滤器说,某个数据存在时,这个数据可能不存在;当布隆过滤器说,某个数据不存在时,那么这个数据一定不存在。将所有可能存在的数据哈希到一个足够大的 bitmaps 中,一个一定不存在的数据会被这个 bitmaps 拦截掉,从而避免了对底层存储系统的查询压力。
  4. 进行实时监控: 当发现 redis 的命中率开始急速降低,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制服务。

🍓缓存击穿

🎯什么是缓存击穿?

key 对应的数据存在,但在 redis 中过期,并且恰好该数据还是 “热点” 访问数据,此时若有大量并发请求过来,这些请求会发现缓存失效从而直接从数据库中加载数据并写会缓存,这时候大量的并发请求可能瞬间把数据库服务压垮。

2

🎯解决方案:

  1. 预先设置热门数据: 对于很多热门 key,其实是可以不用设置过期时间,让其永久有效。比如最近的热点新闻,我们先让程序提前从数据库中查出数据并同步到缓存中,扛过高并发访问以后再把数据从 redis 中移除。
  2. 自动续期: 缓存击穿是由于 key 过期导致的,我们可以让程序在 key 快要过期之前,就自动给它续期。比如 key 的过期时间为 30 分钟,我们让程序每 20 分钟就查一次数据库同步缓存,自动重置过期时间为 30 分钟。
  3. 使用互斥锁: 某个线程查询缓存未命中,这时它会去获取互斥锁,然后查询数据库获取结果并将结果写入缓存中,最后释放锁。在该线程释放锁之前,其它线程都不能获取锁,只能睡眠一段时间后重试,如果能命中缓存,则返回数据,否则继续尝试获取互斥锁。这种方案并不推荐使用,使用锁会让性能受到影响,还可能会带来死锁的问题。

🍑缓存雪崩

⛄什么是缓存雪崩?

redis 中的 key 在某一时间集中过期,此时若有大量的并发请求过来,这些请求最终都会落在数据库上,从而导致后端的数据库服务挂掉。

3

缓存击穿与缓存雪崩的区别是击穿是一个 key 过期,雪崩是多个 key 过期。

⛄解决方案:

  1. 将缓存失效时间分散开: 我们可以在原有的失效时间基础上增加一个随机值,比如 1-5 分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
  2. 自动续期: 跟缓存击穿中的解决办法一样,在 key 快要过期的时候让另外的线程自动更新缓存。
  3. 构建多级缓存架构: 使用多个缓存服务,比如 nginx + redis + ehcache…
  4. 使用锁或队列: 用加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。但不适用高并发情况。

🚀redis 系列专栏:Redis 快速入门
❤整理不易❤ 还请各位读者老爷们三连支持一下╰( ̄ω ̄o)

footer

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

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

相关文章

快速查找qt pro文件中的用qmake language写的库函数

qt函数分为test函数和replace函数:qmake language 内置函数 自定义函数 defineTest(testfunctionname) defineReplace(repacefunctionname)_丘上人的博客-CSDN博客 qt为qmake language提供了内建函数(用C写的逻辑)和用qmake language写的库函…

html移动端实现手写签名,signature手写签名实现,微信公众号浏览器html手写签名实现

前言 html移动端手写自动横竖签名实现&#xff0c;并base64图片格式获取&#xff1b; 横竖根据屏幕宽高自动平铺。 效果图 图一 图二 实现 如下代码直接复制成.html文件打开即可预览效果 <!DOCTYPE html> <html><head><title>手写签名</title&…

适合中小企业的ERP管理软件如何选择?

在选择ERP系统时&#xff0c;我们可以按照这三个维度&#xff0c;然后再按照需求去选择ERP系统。 市面上ERP软件大概可以分为三大类&#xff1a; ① 标准ERP应用&#xff1a;功能比较固定&#xff0c;难以满足个性化需求&#xff0c;二次开发难度很高&#xff1b; ② 找外包/…

SQL 的执行流程是什么样的

在选择存储引擎时&#xff0c;应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统&#xff0c;还可以根据实际情况选择多种存储引擎进行组合。 以下是几种常用的存储引擎的使用环境。 InnoDB : 是 Mysql 的默认存储引擎&#xff0c;用于事务处理应用程序&#xf…

浅谈薄膜行业MES解决方案

随着国家节能减排的号召&#xff0c;新能源电动汽车蓬勃发展&#xff0c;带动整个锂电行业的崛起&#xff0c;锂电池的结构中&#xff0c;隔膜是关键的内层组件之一。隔膜的性能决定了电池的界面结构、内阻等&#xff0c;直接影响电池的容量、循环以及安全性能等特性&#xff0…

数据中台选型必读(四):要想中台建的好,数据模型得做好

在数据中台构建之前&#xff0c;分析师经常发现自己没有可以复用的数据集&#xff0c;不得不使用原始数据依次进行数据的清洗、加工、计算指标。 重复进行原始数据的清洗加工 由于业务部门的分析师大多是非技术出身&#xff0c;写的SQL可能比较差&#xff0c;多层嵌套对后台的…

【教学类-13-02】20221115《数字色块图5*7*8横板》(中班主题《》)

效果展示 背景需求&#xff1a; 前期中3班制作5*7 *9张数字图&#xff0c;发现三个问题&#xff1a; 1、数量太多&#xff0c;填不完——每人9张调整为每人4张&#xff08;一张A4两份作业&#xff09; 2、数字太浅&#xff0c;看不清——5*7的提示数字是灰色&#xff0c;数字…

WeNet更新:喜马拉雅团队在 WeNet 中支持 Squeezeformer

WeNet在正式发布两年的时间里&#xff0c;成为非常热门的ASR生产工具&#xff0c;其面向生产的属性更是深受工业界的好评。近期&#xff0c;喜马拉雅团队在WeNet中支持了Squeezeformer的相关工作。本文由喜马拉雅珠峰智能实验室撰写&#xff0c;介绍了Squeezeformer论文的复现细…

vant_vant引入

目录vant官网使用vant[1]导入vant 的所有组件[2] 按需引入组件[3]自动按需引入组件使用过程中遇到的问题[1]问题1-版本冲突vant官网 vant2.0官网 使用vant 参考vant官网–>快速上手–>通过npm安装/引入组件 [1]导入vant 的所有组件 [1] 安装 vant &#xff1a;npm i va…

基于matlab的MRC最大合并比误码率仿真,包括维特比译码,MRC,中继

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB代码预览 4.完整MATLAB程序 1.算法概述 最大比合并&#xff08;Maximal Ratio Combining&#xff0c;MRC&#xff09;是分集合并技术中的最优选择&#xff0c;相对于选择合并和等增益合并可以获得最好的性能&#xff0c;其性能…

STC51单片机29——汇编语言 取表法 流水灯

汇编语言编写流水灯 ORG 0 START: MOV DPTR,#TABLE LOOP: CLR A MOVC A,ADPTR CJNE A,#01H,LOOP1 //假如A等于01H &#xff0c;则执行下一句 JMP START LOOP1: MOV P1,A MOV R3,#20 LCALL DELAY INC DPTR //指针自加1 JMP LOOP DELAY: MOV R4,#20 D1: MOV R5,#24…

【6-Git安装与配置过程、Gitee码云上创建项目、IDEA关联克隆的项目】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

异常检测 | MATLAB实现BiLSTM(双向长短期记忆神经网络)数据异常检测

异常检测 | MATLAB实现BiLSTM(双向长短期记忆神经网络)数据异常检测 目录 异常检测 | MATLAB实现BiLSTM(双向长短期记忆神经网络)数据异常检测效果一览基本介绍模型准备模型设计参考资料效果一览 基本介绍 训练一个双向 LSTM 自动编码器来检测机器是否正常工作。 自动编码器接受…

一文教你搞懂Go中栈操作

LInux 进程在内存布局 多任务操作系统中的每个进程都在自己的内存沙盒中运行。在 32 位模式下&#xff0c;它总是 4GB 内存地址空间&#xff0c;内存分配是分配虚拟内存给进程&#xff0c;当进程真正访问某一虚拟内存地址时&#xff0c;操作系统通过触发缺页中断&#xff0c;在…

前后端必知必会的HTTP,这份全彩版图解手册可算是给讲透了

HTTP HTTP (HyperText Transfer Protocol)&#xff0c;即超文本运输协议。是互联网上应用最为广泛的一种网络协议&#xff0c;是一个客户端和服务器端请求和应答的标准&#xff08;TCP&#xff09;&#xff0c;用于从WWW服务器传输超文本到本地浏览器的传输协议&#xff0c;它…

基础15:npm、yarn、pnpm

npm2 用 node 版本管理工具把 node 版本降到 4&#xff0c;那 npm 版本就是 2.x 了。 执行 npm init&#xff0c; npm install express&#xff0c;可以看到node_modules目录如下&#xff1a; 可以看到&#xff0c;npm2的node_modules是嵌套的。 这种方式的优点就是模块依赖关…

NDIR二氧化碳传感器原理介绍

文章目录1. 引言2. 分类3. 红外气体传感原理3.1 朗伯-比尔定律3.2 非分光红外&#xff08;NDIR&#xff09;法检测原理3.3 浓度、温湿度标定3.4 响应时间研究4. 参考文献1. 引言 环境领域&#xff1a;近些年&#xff0c;二氧化碳是引起温室效应的主要气体&#xff0c;因此引起…

项目可交付成果的质量管理该怎么做?

通往项目最终服务或产品的道路往往是由许多临时可交付成果铺就的。每一个可交付成果本身都必须完整、质量合适并与所有其他可交付成果协调&#xff0c;同时确保&#xff1a; ● 保持客户和主要利益相关者所要求的质量水平。 ● 项目可交付成果是根据客户的规格和项目目标开发…

使用jenkins自动打包构建Maven项目

1.Jenkins是什么&#xff08;借鉴官网&#xff09; Jenkins是一款开源 CI&CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测试和部署软件。 Jenkins 支持各种运行方式&#xff0c;可通过系统包、Docker 或者通过一个独立的 Java 程序 2.Jenkins下载安装 …

指纹和虚拟机哪个好用?两者之间的区别是什么?

2022年了&#xff0c;相信大家对指纹浏览器都不陌生了&#xff0c;很多做跨境电商、海外社媒营销、联盟营销的企业都会借助指纹浏览器来多账号批量管理。而在指纹浏览器没出现之前&#xff0c;大部分企业都会使用虚拟机来解决浏览器环境安全问题。所以指纹浏览器和虚拟机到底哪…