08. Redis 缓存穿透和雪崩

文章目录

  • 1. 缓存穿透(查不到导致的)
    • 1.1 概念
    • 1.2 解决方案
      • 布隆过滤器
      • 缓存空对象
  • 2. 缓存击穿(量太大、缓存过期)
    • 2.1 概念
    • 2.2 解决方案
      • 设置热点数据永不过期
      • 加互斥锁
  • 3. 缓存雪崩(缓存集体失效或 Redis 宕机)
    • 3.1 概念
    • 3.2 解决方案
      • Redis 高可用
      • 限流降级
      • 数据预热

1. 缓存穿透(查不到导致的)

1.1 概念

用户想要查询一个数据,发现 Redis 数据库没有,也就是缓存没有命中,于是向持久层数据库查询,发现也没有,于是本次查询失败。当用户很多的时候(比如秒杀场景),缓存都没有命中,于是所有用户都去请求数据库。这给持久层数据库带来了很大的压力,这时候就相当于出现了缓存穿透

1.2 解决方案

布隆过滤器

布隆过滤器是一种数据结构,对所有可能查询的参数以 Hash 形式存储,在控制层先进行校验,不符合要求的就丢弃,从而避免了对底层存储系统的压力。

缓存空对象

当存储层不命中后,即使返回空对象也将其缓存起来,同时会设置一个过期时间。这样的话,之后再访问这个数据的时候将会从缓存中取出,保护了后端数据源。

存在的问题:

  • 如果空值能够被缓存起来,这意味着缓存需要更多的空间存储这些数据,而其中很多数据的值是空的。

2. 缓存击穿(量太大、缓存过期)

2.1 概念

缓存击穿,是指一个 key 非常的热点,在不停的扛着大并发,大并发集中对这一个点进行访问。当这个 key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,导致数据库瞬间压力过大。

2.2 解决方案

设置热点数据永不过期

从缓存层面来看,热点数据不设置过期时间,就不会出现热点数据过期导致的缓存击穿。(一直缓存浪费缓存空间)

加互斥锁

使用分布式锁,保证对于每个 key 同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,等待即可。

这种方式将高并发的压力转移到了分布式锁。

3. 缓存雪崩(缓存集体失效或 Redis 宕机)

3.1 概念

缓存雪崩,是指在某一个时间段,缓存集体过期失效或者 Redis 宕机。于是所有的请求都会到达存储层,存储层的调用量会暴增,造成存储层挂掉的情况。

比如双十一零点抢购商品,抢购的商品肯定集中放在了缓存,假设缓存一个小时。那么到一点的时候,这批商品的缓存都到期了,这时候对这批商品的查询,都落到了数据库上。

3.2 解决方案

Redis 高可用

这个思想就是,既然 Redis 有可能挂掉,那我就多增设几台 Redis 服务器,其实就是搭建 Redis 集群。

限流降级

这个方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。

数据预热

数据预热的含义就是,在正式部署之前,先把可能访问的数据预先访问一遍,这样部分可能大两房问的数据就会先加载到缓存中。在即将发生大并发访问之前,手动触发加载缓存不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀

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

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

相关文章

说一下你对dom驱动和数据驱动的理解

DOM驱动和数据驱动是前端开发中两种常见的操作方式,尤其在构建用户界面时。下面,我将分别解释这两种驱动方式,并提供详细的代码示例。 DOM驱动 DOM驱动的核心思想是直接操作DOM元素来更新用户界面。在早期的Web开发中,这种方式非…

Linux指令初识

ls:显示当前目录底下的指定文件或目录 ls -l更详细的信息 ls -a显示当前目录下的所有文件 命令中的选项可以一次传递多个 ,例如:ls -al 命令和选项有必须一个或多个空格 以.开头的文件,为隐藏文件ls -a可以看到,ls -l看不见 支持命令拼在一起&#…

牛客热题:滑动窗口的最大值

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:滑动窗口的最大值题目链接方法一…

DNS服务的部署与配置(2)

1、dns的安装及开启 dnf install bind.x86_64 -y #安装 #Berkeley Internet Name Domain (BIND) systemctl enable --now named #启用dns服务,服务名称叫named firewall-cmd --permanent --add-servicedns #火墙设置 firewall-cmd --reload …

【手把手搓组件库】从零开始实现Element Plus--组件开发

从零开始实现Element Plus--组件开发 nvmnvm的作用:nvm的使用方法 需求分析提示词Kimi 生成产品需求文档kimi 生成测试用例 初始化 vitest完善 Button 组件1、定义 types.ts2、Button.vue 引入 types.ts3、添加Button样式点击事件 添加节流添加 Icon 集成 StoryBook…

C++第十九弹---string模拟实现(下)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、修改操作 2、迭代器操作 3、字符串操作 4、非成员函数重载操作 总结 1、修改操作 1、string& operator (const char* s); //尾部插入…

【Text2SQL 论文】SeaD:使用 Schema-aware 去噪训练的 end2end 的 Text2SQL

论文:SeaD: End-to-end Text-to-SQL Generation with Schema-aware Denoising ⭐⭐ NAACL 2022, arXiv:2105.07911 本论文提出 SeaD 模型,使用 schema-aware 的去噪方法来训练一个 end2end、seq2seq 的 Transformer 模型来实现 Text2SQL。 一、论文速读…

C++系列-static成员

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 概念 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量,用static修饰的成员函数,称之为静态成…

stm32学习-流水灯

接线 注意:LED灯长一点的引脚是正极。 配置GPIO 1.使用RCC开启GPIO时钟 void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); void RCC_APB1Perip…

Stanford斯坦福 CS 224R: 深度强化学习 (2)

实用深度强化学习实现技术 强化学习(RL)是一种通过智能体与环境交互来学习最优决策的机器学习范式。而深度强化学习(DRL)则将深度学习技术引入RL领域,利用深度神经网络强大的函数拟合能力来处理高维观察空间,取得了显著的成功。本章我们将重点介绍一种经典的DRL算法:Q-Learnin…

【Qt 学习笔记】Qt窗口 | 菜单栏 | QMenuBar的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt窗口 | 菜单栏 | QMenuBar的使用及说明 文章编号:Qt 学习…

第20届文博会:“特别呈现”—周瑛瑾雷米·艾融双个展,著名美术评论家,批评家彭德教授对周瑛瑾作品进行评论

周瑛瑾不是学院派艺术家,但在彩墨画领域的天赋超出中国八大美院的同类型画家。相比具有批判意识的当代艺术,他的彩墨艺术如同我们这个苦难世界的创可贴和安慰剂。当我面对他的彩墨画,首先是惊艳,随之想到屈原的离骚,还…

无源相控阵雷达

什么是无源相控阵雷达 无源相控阵雷达(Passive Electronically Scanned Array Radar,简称PESA雷达)是一种雷达系统。这里的“无源”并未指其不发射信号,而是指其阵列单元不会产生并发射信号,其特点在于天线表面的阵列…

Vue与React、Angular的比较

Vue、React和Angular是前端开发中三个流行的JavaScript框架,它们各自具有不同的特点、优势和适用场景。以下是对这三个框架的比较: 1. 基本概念 Vue:Vue是一套用于构建用户界面的渐进式框架,其核心库专注于视图层,易…

[CISCN 2024] Crypto部分复现

文章目录 OvOez_rsacheckin浅记一下 迟来的文章 OvO 题目描述: from Crypto.Util.number import * from secret import flagnbits 512 p getPrime(nbits) q getPrime(nbits) n p * q phi (p-1) * (q-1) while True:kk getPrime(128)rr kk 2e 65537 kk …

【三维修复、分割与编辑】InFusion、Bootstrap 3D、GaussianGrouping、GaussianEditor等(论文总结)

提示: 文章目录 前言一、InFusion:扩散模型助力,效率提高20倍!(2024)1. 摘要2. 算法3. 效果 二、2D Gaussian Splatting三、Bootstrap 3D:从扩散模型引导三维重建1.摘要2.相关工作3.方法1.Boostrapping by Diffusion 通过扩散模型…

学习存储协议的利器,聊聊tcpdump和Wireshark

数据存储技术分为多个方面,包括数据持久化、数据映射、数据压缩和通信协议等等。其中通信协议是数据存储技术中非常重要的一部分,正是通信协议使得计算节点可以访问存储设备。同时,也正是不同的协议让存储系统呈现不同的形态。 如下图所示,通过iSCSI协议,可以将存储端的存…

使用std::vector<char>作为数据缓冲区分析

文章目录 0. 引言1. 内存分配分析2. 性能影响3. 性能优化策略4. 实际性能测试5. 优化建议6. 总结额外建议 0. 引言 在 C 网络编程中&#xff0c;std::vector<char> 常被用作数据缓冲区。与普通数组相比&#xff0c;std::vector 的内存分配在堆上&#xff0c;而非栈上&am…

【JVM实践与应用】

JVM实践与应用 1.类加载器(加载、连接、初始化)1.1 类加载要完成的功能1.2 加载类的方式1.3 类加载器1.4 双亲委派模型1.5自定义ClassLoader1.6 破坏双亲委派模型2.1 类连接主要验证内容2.2 类连接中的解析2.3 类的初始化3.1 类的初始化时机3.2 类的初始化机制和顺序3.2 类的卸…

C从零开始实现贪吃蛇大作战

个人主页&#xff1a;星纭-CSDN博客 系列文章专栏 : C语言 踏上取经路&#xff0c;比抵达灵山更重要&#xff01;一起努力一起进步&#xff01; 有关Win32API的知识点在上一篇文章&#xff1a; 目录 一.地图 1.控制台基本介绍 2.宽字符 1.本地化 2.类项 3.setlocale函…