当前位置: 首页 > news >正文

Redis中的缓存穿透、雪崩、击穿(详细)

目录

一、概念

1. 缓存穿透(Cache Penetration)

解决方案:

2. 缓存雪崩(Cache Avalanche)

解决方案:

3. 缓存击穿(Cache Breakdown)

 解决方案:

二、三者出现的根本原因

1. 缓存穿透(Cache Penetration)

2. 缓存雪崩(Cache Avalanche)

3. 缓存击穿(Cache Breakdown)

 


一、概念

在Redis中,缓存穿透、缓存雪崩和缓存击穿是与缓存相关的三个常见问题,它们都可能对系统性能和可用性产生负面影响。以下是它们在Redis中的概念:

1. 缓存穿透(Cache Penetration)

概念: 缓存穿透是指查询一个不存在于缓存中的数据,导致每次请求都直接访问底层存储系统,而不会被缓存。这可能是由于查询的数据根本不存在,或者是由于恶意攻击而导致大量查询。

解决方案:

  • 使用布隆过滤器(Bloom Filter)来快速判断一个数据是否存在于缓存中。
  • 使用空值缓存,即使查询结果为空,也能减轻对底层存储系统的频繁查询。
解决方案:
  • 使用布隆过滤器(Bloom Filter)来快速判断一个数据是否存在于缓存中。
  • 使用空值缓存,即使查询结果为空,也能减轻对底层存储系统的频繁查询。

 

2. 缓存雪崩(Cache Avalanche)

概念: 缓存雪崩是指缓存中的大量数据同时失效或者同时被删除,导致大量请求直接访问底层存储系统,造成系统压力增大,甚至崩溃。

解决方案:
  • 随机化缓存数据的过期时间,避免大量数据同时失效。
  • 使用多级缓存结构,其中一级缓存失效时,可以从下一级缓存获取数据。
  • 缓存预热,在系统启动或低峰期,预先加载热门数据到缓存中。

3. 缓存击穿(Cache Breakdown)

概念: 缓存击穿是指一个热门的缓存键突然失效,导致大量请求直接访问底层存储系统,造成系统压力增大。与缓存雪崩不同的是,缓存击穿通常是某个特定的缓存键失效。

 解决方案:
  • 使用互斥锁或分布式锁,确保只有一个请求能够重新生成缓存数据,其他请求等待。
  • 在缓存失效时,通过异步方式重新生成缓存,避免大量请求同时访问底层存储系统。

这些问题在设计和使用Redis缓存时需要特别注意,采取适当的解决方案可以有效地提高系统的稳定性和性能。

 

二、三者出现的根本原因

缓存穿透、缓存雪崩和缓存击穿这三个问题的出现都与缓存系统的设计和使用方式有关,它们分别由不同的原因引起。

1. 缓存穿透(Cache Penetration)

根本原因: 缓存穿透的根本原因是查询的数据不存在于缓存中,但仍然被频繁查询,导致每次请求都直接访问底层存储系统。这可能是由于查询的数据根本不存在,或者是由于查询的数据无效。

导致因素:

  • 恶意攻击或非法请求,查询不存在的数据。
  • 查询的数据在缓存中没有被预先加载,而且也不存在于底层存储系统中。

解决方案:

  • 使用布隆过滤器来快速判断一个数据是否存在于缓存中。
  • 使用空值缓存,即使查询结果为空,也能减轻对底层存储系统的频繁查询。

2. 缓存雪崩(Cache Avalanche)

根本原因: 缓存雪崩的根本原因是缓存中的大量数据同时失效或者同时被删除,导致大量请求直接访问底层存储系统。

导致因素:

  • 缓存数据的过期时间设置不合理,导致大量数据在同一时间失效。
  • 缓存服务器宕机或重启。

解决方案:

  • 随机化缓存数据的过期时间,避免大量数据同时失效。
  • 使用多级缓存结构,其中一级缓存失效时,可以从下一级缓存获取数据。
  • 缓存预热,在系统启动或低峰期,预先加载热门数据到缓存中。

3. 缓存击穿(Cache Breakdown)

根本原因: 缓存击穿的根本原因是一个热门的缓存键突然失效,导致大量请求直接访问底层存储系统。

导致因素:

  • 特定缓存键的数据失效,导致大量请求同时访问底层存储系统。

解决方案:

  • 使用互斥锁或分布式锁,确保只有一个请求能够重新生成缓存数据,其他请求等待。
  • 在缓存失效时,通过异步方式重新生成缓存,避免大量请求同时访问底层存储系统。

 

 

 

 

 

相关文章:

Redis中的缓存穿透、雪崩、击穿(详细)

目录 一、概念 1. 缓存穿透(Cache Penetration) 解决方案: 2. 缓存雪崩(Cache Avalanche) 解决方案: 3. 缓存击穿(Cache Breakdown) 解决方案: 二、三者出现的根本原…...

iframe

iframe学习 1.iframe是什么? a)iframe是html元素,用于在网页中内嵌另一个网页。 b)iframe默认有一个宽高,存在边界。 c)iframe是一个行内块级元素,可以通过display修改。 2.iframe元素属性有哪些? a)src : 指定内联网页的地…...

rust 基本数据类型

Rust 是 静态类型(statically typed)语言,也就是说在编译时就必须知道所有变量的类型,基本类型如下 整型 整数 是一个没有小数部分的数字长度有符号无符号8-biti8u816-biti16u1632-biti32u3264-biti64u64128-biti128u128archisi…...

centos7中通过kubeadmin安装k8s集群

k8s部署官方提供了kind、minikube、kubeadmin等多种安装方式。 其中minikube安装在之前的文章中已经介绍过,部署比较简单。下面介绍通过kubeadmin部署k8s集群。 生产中提供了多种高可用方案: k8s官方文档 本文安装的是1.28.0版本。 建议去认真阅读一下…...

普中STM32 单片机资料

普中科技–各型号开发板资料下载链接: ①普中-精灵1开发板: 百度网盘链接:https://pan.baidu.com/s/1Pa8Ep1xmg6uoq17O6Nwyyw?pwd=1234 提取码:1234 ②普中-ESP32开发板: 百度网盘链接:https://pan.baidu.com/s/16VthcbW27oEWp162H3bi6Q?pwd=1234 提取码:1234 一…...

docker报错

安装 docker报错: Docker Desktop requires the Server service to be enabled. 解决方法: 管理员身份打开cmd,输入: services.msc开启 server 服务。 docker启动报错: 打开 docker 界面报错: Docke…...

pytest分布式执行(pytest-xdist)

前言 平常我们手工测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟。如果一个测试人员执行需要1000分钟才能执行完,当项目非常紧急的时候,我们会用测试人力成本换取时间成本,这个时候多找个小伙伴把任务…...

spring和springBoot

Spring和Spring Boot小结 Spring和Spring Boot基于IOC AOP理念实现,Spring Boot集成了Spring。Spring框架: Spring框架解决了企业级的开发的复杂性,它是一个容器框架,用于装java对象(Bean),使程…...

laraval6.0 GatewayWorker 交互通信

laravel 6.0 GatewayWorker 通讯 开发前准备下载 GatewayWorker 及操作方式前端demo测试效果项目中安装GatewayClient 开发前准备 GatewayClient 官网:https://www.workerman.net/ 当前使用的是宝塔操作 下载 GatewayWorker 及操作方式 前端demo 测试效果 项目中安…...

循环神经网络RNN

1. 背景 RNN(Recurrent Neural Networks) CNN利用输入中的空间几何结构信息;RNN利用输入数据的序列化特性。 2. SimpleRNN单元 传统多层感知机网络假设所有的输入数据之间相互独立,但这对于序列化数据是不成立的。RNN单元用隐藏状态或记忆引入这种依赖…...

为什么预处理对象会提升处理的性能

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要环绕 “预处理对象会提升处理的性能” 这个问题做出解答以及关于预处理部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获&#xff…...

智能超声波雾化器pcba方案

一、超声波雾化器方案工作原理 超声波雾化器是一款基于电路板的振荡信号被大功率三极管进行能量放大,传递给压电陶瓷片,当压电陶瓷片受电信号的激励,产生高频谐振,并使吸附在微孔膜上的液体结产生超声振荡,将液体的结构…...

Git分支合并导致文件异常

昨天合并分支后,突然出现了项目中全部的文件出现异常。 先说结论:合并导致文件冲突处理异常,Git lfs 异常 解决方式:CMD 中执行 git lfs install git lfs pull。 合并分支后,发现项目中全部的png异常,编译a…...

Linux(11):Linux 账号管理与 ACL 权限设定

Linux 的账号与群组 每个登入的使用者至少都会取得两个 ID,一个是使用者 ID(User ID ,简称UID)、一个是群组ID (Group ID ,简称GID)。 Linux系统上面的用户如果需要登入主机以取得 shell 的环境来工作时,他需要如何进行呢? 首先…...

AMEYA360:村田首款1608M尺寸/100V静电容量1µF的MLCC实现商品化

株式会社村田制作所成功开发了用于基站、服务器和数据中心48V线路的多层陶瓷电容器“GRM188D72A105KE01”并已量产。该产品在1608M(1.60.8mm)尺寸、100V的额定电压下可实现1μF的超大静电容量(村田调查数据,截至2023年11月20日)。目前可向村田申请免费样品。 随着5G…...

简易键值对文本解析

除了json,xml,protobuf等成体系的配置文件外&#xff0c;简单的文本格式“key value”的配置文件也在很多开源项目中存在&#xff0c;这种配置文件的好处是简单、易于理解和编辑。 #include <stdio.h> #include <string.h>#define MAX_LINE_LENGTH 1024void Parse…...

成为AI产品经理——模型评估(混淆矩阵)

一、混淆矩阵 1.混淆矩阵的介绍 混淆矩阵有两个定义positive&#xff08;正例&#xff09;和negative&#xff08;反例&#xff09;。分别代表模型结果的好和坏。 下图就是一个分类问题的混淆矩阵。横行代表真实的情况&#xff0c;而竖行代表预测的结果。 为了便于理解&…...

Git_git相关指令 高阶

git config pull.rebase false git config pull.rebase false是做什么的_fury_123的博客-CSDN博客 git commit 命令详解_gitcommit_辰风沐阳的博客-CSDN博客...

PC企业微信http协议逆向接口开发,发送大视频文件

产品说明 一、 hook版本&#xff1a;企业微信hook接口是指将企业微信的功能封装成dll&#xff0c;并提供简易的接口给程序调用。通过hook技术&#xff0c;可以在不修改企业微信客户端源代码的情况下&#xff0c;实现对企业微信客户端的功能进行扩展和定制化。企业微信hook接口…...

hyper-V操作虚拟机ubuntu 22.03

安装hyper-V 点击卸载程序 都勾选上即可 新建虚拟机&#xff0c;选择镜像文件 选择第一代即可 设置内存 配置网络 双击 启动安装虚拟机 输入用户名 zenglg 密码&#xff1a;LuoShuwen123456 按照enter键选中openssh安装 安装中 安装完成 选择重启 输入用户名、密码...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...