redis 缓存穿透,缓存击穿,缓存雪崩

article/2025/8/26 2:15:10

虽然我们在使用 redis 缓存的时候非常的爽,它大大的提高了我们应用程序的性能和效率,尤其是数据查询方面,咱们不用直接去持久化的数据库中查询数据,而是到内存中查询数据即可

事物总是有两面的,用的爽的同时,也必须面对它带来的问题,就是数据一致性的问题,这个问题,是一个权衡利弊的问题,咱们接着看

redis 缓存和一些持久化的数据库配合使用的时候,会出现一些高可用的问题,如:

  1. 缓存穿透
  2. 缓存击穿
  3. 缓存雪崩

咱们能够解决上述问题,那就解决了一部分服务器高可用的问题

什么是缓存穿透

咱们先学习一部分,关于底层原理和实际源码分析,咱们之后再一起看
在这里插入图片描述
缓存穿透,就是用户想要查询一个数据,在 redis 中查询不到,即没有在缓存中命中,那么就会直接去持久化的 mysql 中进行查询,发现也没有这个数据,那么本次查询就失败了

当用户巨多的时候,查询缓存都没有查询到,那么这些全部都去查询持久化的 mysql 数据库,压力全部打到 mysql 上面,这就是缓存穿透

解决方案有一般有 2 种方式

  1. 使用布隆过滤器
  2. 缓存空的对象

使用布隆过滤器
布隆过滤器是一种数据结构,对所有可能查询到的参数都是以 hash 的方式存储,会先在控制层进行校验,不符合的话,则丢弃,这就避免了对底层存储系统的压力
在这里插入图片描述
布隆过滤器部署在 redis 的前面,去拦截数据,减少对 redis 的冲击,进而减小对 持久化层的冲击

缓存空的对象
缓存空对象,就是当我们在持久化的数据库中没有查询到我们期望的数据时,那么就返回一个空对象,并且将这个空对象缓存起来,再对其设置一个过期时间

那么之后再有访问这个对象的请求时,缓存直接访问空对象即可,这就可以保护持久化数据层,减少对他的冲击压力
在这里插入图片描述
通过上述缓存空对象的方式,貌似也能解决问题,但是使用持久下去,会发现 key 值对应的空对象越来越多,会出现下面 2 个问题

  1. 非常多的空对象被缓存起来,那么对应就很多的 key 占用 内存空间,占用资源,内存压力直线上升
  2. 如果空对象的过期时间到了,那么请求的压力还是会打到持久化数据库上面,这会影响数据的一致性业务

什么是缓存击穿
在这里插入图片描述
出现缓存击穿的情况是数据量太大,或者是缓存过期了

当某个 key 在过期的瞬间,有大量的请求这个 key 的数据,这种数据是热点数据,由于在缓存过期的瞬间,请求会同时访问到持久化的数据库来查询数据,并且会将数据会写到缓存中,此时就会导致数据库瞬间的压力过大,导致击穿

此处可以理解 击穿和穿透的区别:

击穿,是一个 key 非常热点,大量的访问都打在这个 key 上面,在 key 失效的瞬间,所有请求打在数据库上,就打出一个洞,击穿了

而穿透更多的是访问的数据不存在的情况,大量的请求访问的都是不存在的数据

缓存击穿的解决方案

  1. 将热点数据设置不过期,不设置过期时间,就不会出现热点 key 过期的瞬间造成问题
  2. 加上分布式锁,保证对于每一个 key ,同时只有一个服务进行访问,其他的服务没有获取到锁,就不能访问 redis 的这个 key,那么就需要等待获取锁

这种方式,锁的压力就非常大了,访问 redis 前先去访问锁,相当于锁给 redis 挡了一层

什么是缓存雪崩
在这里插入图片描述
缓存雪崩就是在某一个时间段,缓存集中过期,或者 redis 宕机的情况会出现

例如:

在某些热点活动中,会设置某些商品在一个固定的时间内过期,那么在 redis 里面,这个固定的时间点,大量的 key 过期,这就导致在这个时间段 缓存失效了,

且大量的请求数据都打在了持久化数据库上面了,这就很难受,在这种压力波峰下,压力全部打在持久化数据库上,这会造成持久化数据库宕机

上述的情况,key 集中过期问题还不是非常的痛,最痛的是 redis 宕机了,自然周期性的形成的波峰压力,咱们的持久化数据库还是能够顶得住压力的,偏偏是在 redis 异常宕机,一挂挂一片,这就很有可能将后方的持久化数据库全部打挂,这是毁灭性的压垮

缓存雪崩的解决方案:

  1. 将 redis 做成高可用的
    搭建 redis 集群,异地多活,既然担心 redis 会挂,那么我们就多准备一些 redis ,做成主备,或者异地多活
  2. 限流降级
    就是在缓存失效的时候,通过锁的方式来限制访问数据顺序,或者关掉一些不重要的服务,让资源和性能全力提供给我们的主要服务
  3. 做数据预热
    数据预热就是咱们在正式要上线之前,咱们就先将需要访问的数据预先访问一次,这样就可以将大量要访问数据库的数据写到缓存中
    这样就可以在即将发生的高并发访问数据前手动的触发并加载不同的 key ,且会设置不同的过期时间,主要是可以将缓存失效的事情均衡一些,这样就尽量避免掉大量的 key 集中过期的情况

http://chatgpt.dhexx.cn/article/8mmRZes0.shtml

相关文章

缓存穿透、缓存击穿、缓存雪崩的理解和解决方案

目录 一、缓存穿透 二、缓存击穿 三:缓存雪崩 在生产环境中,会因为很多的原因造成访问请求绕过了缓存,都需要访问数据库持久层,虽然对Redsi缓存服务器不会造成影响,但是数据库的负载就会增大,使缓存的作…

详解缓存穿透、缓存雪崩、缓存击穿

背景 在现代软件架构中,缓存的应用已经非常普及。缓存的使用在面试和实践中都是避不开的硬技能、硬知识,如果你说还不太熟悉缓存的使用,可能都不好意思说自己是程序员。 这篇文章,带大家进一步学习在缓存使用中不得不考虑三个特…

【Redis】缓存击穿问题及其解决方案

【Redis】缓存击穿问题及其解决方案 文章目录 【Redis】缓存击穿问题及其解决方案1. 缓存击穿概念2. 解决方案2.1 互斥锁2.1.1 互斥锁的优缺点2.1.2 互斥锁的代码实现 2.2 逻辑过期2.2.1 逻辑过期的优缺点2.2.2 逻辑过期的代码实现 1. 缓存击穿概念 缓存击穿:缓存击…

Redis 缓存穿透、缓存击穿、缓存雪崩

文章目录 一、缓存穿透1. 概念2. 解决方案 二、缓存击穿1. 概念2. 解决方案 三、缓存雪崩1. 概念2. 解决方案 一、缓存穿透 1. 概念 key 对应的数据在redis中并不存在,每次针对此 key的请求从缓存获取不到,请求转发到数据库,访问量大了可能…

Redis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)

一、概述 ① 缓存穿透:大量请求根本不存在的key(下文详解) ② 缓存雪崩:redis中大量key集体过期(下文详解) ③ 缓存击穿:redis中一个热点key过期(大量用户访问该热点key,…

Redis——缓存击穿、穿透、雪崩

1、缓存穿透: (1)问题描述:key对应的数据并不存在,每次请求访问key时,缓存中查找不到,请求都会直接访问到数据库中去,请求量超出数据库时,便会导致数据库崩溃。如一个用…

ping端口

1.ping端口: telnet 62.78.63.209 10105 2.如果提示telnet不是内部或外部命令… 则:右击“此电脑”–>选择“控制面板主页”,单击“程序”,如图: 3.完成。

windows下ping端口

上图的操作完成以后 进入dos控制台 输入telnet ip地址 端口号 回车 标识已ping通 ping不通是这种提示 转载于:https://www.cnblogs.com/shianliang/p/8639392.html

windows ping 端口测试

前言 项目中存在能ping通IP地址,但是打不开web应用程序,这时需要测试端口能否ping通。 解决方法 测试是否能够ping通192.168.0.1的80端口 telnet 192.168.0.1 80遇到问题 ‘telnet’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 …

Windows Server 启用或关闭ping端口

启用或关闭 ping 端口有两种方式,如下 1、通过命令行设置 打开 ping 端口 netsh firewall set icmpsetting 8关闭 ping 端口 netsh firewall set icmpsetting 8 disable2、通过高级安全 Windows 防火墙设置 打开 “高级安全 Windows 防火墙” ,在入…

windows系统ping端口及利用telnet命令Ping 端口

第一步: 第二步:打开telnet client 第三步:telnet ip 端口

Mac系统用命令打开ping端口的方法

电脑上不了网问题相信大家都有遇到过,排查网络故障问题用到ping,之前windows系统上能够轻松打开ping端。但是如果在Mac电脑该如何打开ping端口?其实打开方法并不复杂,接下来小编给大家演示Mac系统用命令打开ping端口的方法。 Mac…

linux ping 某个端口,linux 怎么ping 端口

满意答案 cysdmt 推荐于 2016.12.05 采纳率:54% 等级:8 已帮助:864人 linux命令ping用法详解 功能说明:检测主机。 语 法:ping [-dfnqrrv][-c][-i][-i][-l][-p][-s][-t][主机名称或ip地址] 补充说明:执行…

Win10系统Ping端口及利用telnet命令Ping 端口

启用 telnet 客户端组件为 Ping 端口做准备 在程序界面下,选择“打开或关闭Windows功能”,如下图所示: 在打开的对话框中,找到“Telnet客户端”并勾选。最后点击“确定”,等待几分钟,系统将会为你开启Teln…

计算机ping使用的端口,mac系统ping端口命令怎么使用

最近电脑出问题了,上不了网,想排查下电脑的问题出在哪儿就需要ping,但是该如何打开终端如何ping呢?下面就让学习啦小编教大家MAC系统ping端口命令怎么使用吧。 Mac系统ping端口命令的使用方法 方法一: 在桌面上的DOCK栏中&#x…

w7系统怎么ping服务器,win7系统中如何ping端口命令

正常情况下,win7系统时无法ping端口的,不过要是开启了Telnrt客户端,则可以实现这一功能,启用Telnrt客户端需要用户进入Windows 组件中勾选,当然,如果用户有一个可以专门Ping端口的第三方软件也是可以的。 一…

Win10如何ping端口是否开放

如何ping端口是否开放 前言一、打开Telent Client功能1.打开控制面板2.进入启用Windows功能页面,勾选Telnet客户端3.打开cmd,输入命令 telnet ip 端口4.回车如果进入黑屏页面,则ping通了,否则显示连接失败 前言 ping具体的网址是…

自制python版 在线ping 端口检查工具 python3.5 +docker

自己有几十台服务器需要实现在线检查是否在线和网络延时情况 1.开搞。 docker run -d -p 8000:8000 -i -t -v /pyFile:/usr/src/python python:3.5 /bin/bash 在docker 部署python3.5https://blog.csdn.net/qq_44741568/article/details/120035609 2. 进入容器 &#xff0c…

ping端口的方法 - win下

方法 默认的cmd > ping xx.xx.xx.xx 是无法带端口测试的,需要工具tcping.exe帮忙下载tcping.exe,存放到任意位置,例如D:\tcping小程序下载-tcping工具(tcping.exe)免费版 - 极光下载站tcping工具可以为用户检测非常多的网络问题&#xff…

ping端口神器psping

简介 测试服务端端口是否正常,通过ping命令不能测试端口是否打开、是否可正常连通。当然Telnet也可以解决。本文分享的工具是sysInternals工具集下的一个小工具psPing,这个工具支持Ping:ICMP、TCPorUDP,以及延迟分析和带宽测试。 …