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

Redis生产问题(缓存穿透、击穿、雪崩)——针对实习面试

目录

  • Redis生产问题
    • 什么是缓存穿透?
    • 如何解决缓存穿透?
    • 什么是缓存击穿?
    • 如何解决缓存击穿?
    • 缓存穿透和缓存击穿有什么区别?
    • 什么是缓存雪崩?
    • 如何解决缓存雪崩?

Redis生产问题

在这里插入图片描述

什么是缓存穿透?

缓存穿透是指当请求查询数据库中不存在的数据时,由于在缓存中也没有该数据,导致每次请求都要到数据库查询,这可能会对数据库造成巨大压力,甚至导致数据库崩溃。

这种情况通常发生在以下场景:

  1. 恶意攻击:攻击者故意请求数据库中不存在的数据,导致数据库压力增大。
  2. 数据误删除:当数据库中的数据被删除后,缓存中相应的数据没有被删除,导致后续请求无法命中缓存,直接访问数据库。
  3. 数据更新:当数据库中的数据更新后,缓存中的数据没有及时更新,导致后续请求无法命中缓存,直接访问数据库。

如何解决缓存穿透?

在面试中,当被问到如何解决缓存穿透问题时,你可以从以下几个方面来回答:

  1. 缓存空对象
  • 策略:当数据库中不存在请求的数据时,将空结果缓存起来,并设置一个较短的过期时间。这样,下次相同的请求就会直接命中缓存,避免了对数据库的查询。

  • 实现:在代码中,你可以检查查询结果是否为null,如果是,则将null值缓存,并设置一个较短的TTL(Time To Live)。

  1. 布隆过滤器
  • 策略:使用布隆过滤器来预先判断请求的数据是否可能存在于数据库中。如果布隆过滤器判断数据不存在,则直接返回,不查询数据库。

  • 实现:布隆过滤器是一种空间效率很高的概率型数据结构,它可以告诉你一个元素是否可能存在于集合中。如果布隆过滤器说元素不存在,那么这个元素一定不存在;如果它说元素存在,那么这个元素可能存在也可能不存在。

  1. 限制请求
  • 策略:对于某些特定的请求,比如请求频率过高的用户或IP,可以限制其访问频率,防止恶意攻击。

  • 实现:可以使用限流算法(如令牌桶或漏桶算法)来限制请求频率,或者使用防火墙规则来限制特定IP的请求。

  1. 数据校验
  • 策略:在查询数据库之前,对请求的数据进行校验,确保请求的数据是合法的,避免请求不存在的数据。

  • 实现:在应用层添加逻辑来校验请求参数,确保它们符合预期的格式和范围。

什么是缓存击穿?

缓存击穿是指在缓存中某个热点数据在过期或被删除后,突然失效,导致大量请求同时到达数据库,这种我们称为缓存击穿。

缓存击穿的原因是一个备受欢迎的缓存数据突然失效或宕机,导致重建缓存时,由于是热点Key,所以有不断的线程来查和重建缓存,导致大量数据请求直接到达数据库。

如何解决缓存击穿?

在解决缓存击穿问题时,可以采用以下几种策略:

  1. 设置热点数据永不过期
    对于一些极端热点数据,可以将其缓存设置为永不过期,或者设置一个非常长的过期时间。这样可以避免因为缓存过期导致的缓存击穿问题。(不建议使用

  2. 使用互斥锁
    当缓存失效时,使用互斥锁来保证只有一个线程去查询数据库并更新缓存,其他线程等待。例如在Java中,可以使用ReentrantLock来实现互斥锁。

  3. 提前缓存预热
    在系统上线前,提前将热点数据加载到缓存中,避免大量请求同时触发缓存未命中的情况。(建议使用

  4. 布隆过滤器
    使用布隆过滤器预先判断请求的数据是否可能存在于数据库中。如果布隆过滤器判断数据不存在,则直接返回,不查询数据库。

缓存穿透和缓存击穿有什么区别?

缓存穿透和缓存击穿是缓存系统中两种不同的问题,它们的主要区别在于:

  1. 缓存穿透

    • 原因:请求查询的数据在数据库中不存在,导致缓存中也没有该数据。
    • 影响:大量请求直接打到数据库,增加数据库压力。
    • 解决方法:缓存空对象、使用布隆过滤器、数据校验等。
  2. 缓存击穿

    • 原因:缓存中某个热点数据在过期或被删除后,突然失效
    • 影响:大量请求同时到达数据库,可能导致数据库压力过大。
    • 解决方法:设置热点数据永不过期、使用互斥锁、逻辑过期等。

简而言之,缓存穿透是因为请求的数据根本不存在,而缓存击穿是因为请求的数据在缓存中突然失效
两者都可能导致数据库压力增大,但原因和解决策略有所不同。

什么是缓存雪崩?

缓存雪崩是指在Redis缓存中,大量的Key在同一时间过期,导致大量的请求同时到达数据库,造成数据库压力过大甚至宕机的情况。

缓存雪崩通常发生在以下场景:

  1. 大量Key同时过期:在Redis中设置了大量的Key,并且这些Key的过期时间相同或接近,当这些Key同时过期时,会导致大量的请求同时到达数据库。

  2. 缓存服务宕机Redis服务突然宕机,导致缓存服务不可用,所有的请求都会直接打到数据库上。

  3. 缓存数据全为热点数据:如果缓存中存储的都是热点数据,当缓存服务出现问题时,所有的请求都会直接打到数据库上。

如何解决缓存雪崩?

  1. 分散过期时间

    • 设置不同的过期时间:对于缓存的数据,设置不同的过期时间,避免大量Key同时过期
    • 使用随机数:在设置过期时间时,给每个Key的过期时间添加一个随机数,使得它们不会同时过期。
  2. 持久化存储

    • 使用Redis的持久化功能(如RDB和AOF),确保在Redis重启后能够从磁盘恢复数据,减少因缓存服务宕机导致的数据库压力。
  3. 高可用缓存集群

    • 部署Redis集群,通过主从复制和分片来提供高可用性和扩展性,确保缓存服务不会因为单个节点的故障而完全不可用。
  4. 限流和降级

    • 限流:使用限流算法(如令牌桶或漏桶)来控制请求的流入速率,避免过多请求同时到达数据库。
    • 降级:在缓存服务不可用时,提供降级服务,如返回一些静态数据或缓存中已有的旧数据,以保证系统的基本可用性。
  5. 备用缓存方案

    • 使用本地缓存或其他缓存服务作为备用缓存方案,当主缓存服务不可用时,可以切换到备用缓存。
  6. 预加载缓存

    • 在系统低峰时段,预加载可能即将过期的缓存数据,确保缓存中的数据始终可用

相关文章:

Redis生产问题(缓存穿透、击穿、雪崩)——针对实习面试

目录 Redis生产问题什么是缓存穿透?如何解决缓存穿透?什么是缓存击穿?如何解决缓存击穿?缓存穿透和缓存击穿有什么区别?什么是缓存雪崩?如何解决缓存雪崩? Redis生产问题 什么是缓存穿透&#x…...

android openGL中模板测试、深度测试功能的先后顺序

目录 一、顺序 二、模板测试 1、概念 2、工作原理 3、关键函数 三、深度测试 1、概念 2、工作原理 3、关键函数 三、模板测试和深度测试的先后顺序 一、顺序 在Android OpenGL中,模板测试(Stencil Testing)是在深度测试&#xff0…...

CCF PTA 编程培训师资认证2021年7月真题- C++兑换礼品

【题目描述】 小零和小壹是两个爱玩游戏的小孩,他俩平时最擅长的是解谜游戏,可今天 遇到了一个有点难的算法问题,希望能得到你的帮助。 他们面对的是一个电子装置,正面有 n 个排成一列的按钮,按钮上贴着编号 1~n 号的…...

火山引擎云服务docker 安装

安装 Docker 登录云服务器。 执行以下命令,添加 yum 源。 yum update -y yum install epel-release -y yum clean all yum list依次执行以下命令,添加Docker CE镜像源。更多操作请参考Docker CE镜像。 # 安装必要的一些系统工具 sudo yum install -y yu…...

【taro react】 ---- 常用自定义 React Hooks 的实现【六】之类渐入动画效果的轮播

1. 效果 2. 场景 css 效果实现:可以看到效果图中就是一个图片从小到大的切换动画效果,这个效果很简单,使用 css 的 transform 的 scale 来实现图片的从小到大的效果,切换就更加简单了,不管是 opacity 还是 visibility 都可以实现图片的隐藏和显示的切换。React.Children.m…...

基础算法练习--滑动窗口(已完结)

算法介绍 滑动窗口算法来自tcp协议的一种特性,它的高效使得其也变成了算法题的一种重要考点.滑动窗口的实现实际上也是通过两个指针前后遍历集合实现,但是因为它有固定的解题格式,我将其单独做成一个篇章. 滑动窗口的解题格式: 首先,定义两个指针left和right,与双指针不同的…...

深度学习经典模型之ZFNet

1 ZFNet 1.1 模型介绍 ​ ZFNet是由 M a t t h e w Matthew Matthew D . Z e i l e r D. Zeiler D.Zeiler和 R o b Rob Rob F e r g u s Fergus Fergus在AlexNet基础上提出的大型卷积网络,在2013年ILSVRC图像分类竞赛中以11.19%的错误率获得冠军(实际…...

Linux系统-ubuntu系统安装

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 这是Linux进阶部分的最后一大章。讲完这一章以后,我们Linux进阶部分讲完以后,我们的Linux操作部分就…...

2-Ubuntu/Windows系统启动盘制作

学习目标: 掌握使用Win32DiskImager、Rufus等工具制作系统启动盘的基本步骤。独立将ISO镜像文件写入USB闪存驱动器,确保在需要时顺利安装或修复系统。通过学习如何选择正确的源文件和目标驱动器,理解启动盘的使用场景和注意事项,…...

你使用过哪些MySQL中复杂且使用不频繁的函数?

在MySQL中,除了常用的SELECT、INSERT、UPDATE等基本操作外,还有许多复杂且功能强大的函数,它们能够处理各种复杂的数据处理需求。这些函数虽然在日常开发中可能不常使用,但在特定场景下却能够发挥巨大的作用。下面,我将…...

Redis-07 Redis哨兵

操作实现 此处应该6台虚拟机,其中3台是哨兵,但因为内存限制没有那么多 1.将sentinel文件拷贝到/myredis目录下 2.sentinel.conf文件重要参数 新建配置文件sentinel26379.conf sentinel26380.conf sentinel26381.conf bind 0.0.0.0 daemonize yes pr…...

7.qsqlquerymodel 与 qtableview使用

目录 qtableview 委托QStyledItemDelegateQAbstractItemDelegateCheckBoxItemDelegate使用qtableview控制列宽,行高,隐藏拖拽行列 qtableview 委托 //设置单元格委托 void setItemDelegate(QAbstractItemDelegate *delegate); QAbstractItemDelegate *it…...

状态模式(State Pattern)详解

1. 引言 在很多软件系统中,对象的行为往往依赖于其内部状态,而状态的变化又会影响对象的行为。状态模式(State Pattern)为解决这一问题提供了一种优雅的方法。通过将状态的行为封装到独立的状态对象中,可以使得对象在…...

ajax微信静默登录不起效不跳转问题

问题描述: 今天通过ajax调用方式做微信静默登录,发现本地可以跳转,到线上地址死活都不跳转,就像没起作用一般,经许久排查发现,是因为https和http域名的问题,线上只配置了http域名&#xff0…...

参数估计理论

估计理论的主要任务是在某种信号假设下,估算该信号中某个参数(比如幅度、相位、达到时间)的具体取值。 参数估计:先假定研究的问题具有某种数学模型, 如正态分布,二项分布,再用已知类别的学习样…...

mybatis插入数据运行成功但数据库没有数据,id却在增长,是什么原因??

错误描述: mybatis插入数据运行成功,但是数据库却没有数据,id也在增加 原因:在测试方法上面加了 Transactional 虽然日志显示插入语句执行成功,但可能事务在提交过程中出现了问题。比如在后续的操作中有异常抛出导…...

Hadoop简介及单点伪分布式安装

目录 1. 大数据2. Hadoop简介3. Hadoop伪分布式安装4. Hadoop启动参考 1. 大数据 大数据的定义:一种规模大到在获取、存储、管理、分析方面大大超出传统数据库软件工具能力范围的数据集合。   特征:   1.海量的数据规模   2.快速的数据流转   3.…...

网站架构知识之Ansible模块(day021)

1.Ansible模块 作用:通过ansible模块实现批量管理 2.command模块与shell模块 command模块是ansible默认的模块,适用于执行简单的命令,不支持特殊符号 案列01,批量获取主机名 ansible all -m command -a hostname all表示对主机清单所有组…...

是时候用开源降低AI落地门槛了

过去三十多年,从Linux到KVM,从OpenStack到Kubernetes,IT领域众多关键技术都来自开源。开源技术不仅大幅降低了IT成本,也降低了企业技术创新的门槛。 那么,在生成式AI时代,开源能够为AI带来什么?…...

操作系统学习笔记-5.1-IO设备

文章目录 I/O控制器I/O 控制器的组成I/O 控制器的工作流程I/O 控制器的类型I/O 控制器的主要功能I/O 控制器与操作系统的交互DMA 的工作原理DMA 传输模式DMA 控制器的组成 组成内存映像I/O,寄存器独立编址 IO软件层次用户层 I/O 软件设备独立性软件层设备驱动程序中…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...

git: early EOF

macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...