Redis进阶篇 - 缓存穿透、缓存击穿、缓存雪崩问题及其解决方案

news2024/11/15 12:16:57

文章目录

  • 1 文章概述
  • 2 缓存穿透
    • 2.1 什么是缓存穿透?
    • 2.2 缓存穿透的解决方法
      • 2.2.1 做好参数校验
      • 2.2.2 缓存无效Key
      • 2.2.3 使用布隆过滤器
      • 2.2.4 接口限流
  • 3 缓存击穿
    • 3.1 什么是缓存击穿?
    • 3.2 缓存击穿的解决方法
      • 3.2.1 调整热点数据过期时间
      • 3.2.2 热点数据预热
      • 3.2.3 控制数据库并发
  • 4 缓存雪崩
    • 4.1 什么是缓存雪崩?
    • 4.2 缓存雪崩的解决方法
      • 4.2.1 针对缓存服务不可用的情况
      • 4.2.2 针对缓存大面积过期的情况

1 文章概述

在使用 Redis 作为缓存时,缓存穿透、缓存击穿和缓存雪崩是常见的问题,可能会影响系统性能和稳定性。本文将深入探讨这些问题的概念、产生原因、以及可能带来的影响,并针对这些问题提供的解决方案,以帮助读者更好地理解并解决这些挑战。

2 缓存穿透

2.1 什么是缓存穿透?

缓存穿透问题: 大量且频繁地请求缓存和数据库中都不存在的数据,由于缓存无法命中,这些请求都穿透缓存直接访问数据库,导致数据库压力暴增,影响系统性能。

缓存穿透

缓存穿透可能发生的原因包括查询参数异常、恶意攻击、业务逻辑错误等。如果恶意用户或者攻击者发送大量不存在于缓存中的请求,系统会不断地去查询数据库,导致数据库负载增加,甚至可能引起数据库宕机。缓存穿透不仅影响系统性能,还可能暴露后端数据给未经授权的用户,造成安全隐患。

2.2 缓存穿透的解决方法

要解决缓存穿透问题,本质就是要避免出现请求直接访问数据库的情况。

2.2.1 做好参数校验

解决缓存穿透,最基本的就是首先做好参数校验,从系统入口处就拒绝掉非法的请求,一些不合法的参数请求直接抛出异常信息返回给客户端。比如查询的数据库 id 不能小于 0、传入的邮箱格式不对的时候直接返回错误消息给客户端等等。

做好参数校验

2.2.2 缓存无效Key

做好参数校验只能拒绝掉不符合基本参数校验规则的请求,对于那些符合参数校验规则的无效请求则无能为力。

缓存无效Key方法指的是,在缓存和数据库都查询不到数据的时候,向缓存中插入一个空的数据,并设置过期时间。这样,当下一次接收到相同请求时,就可以直接从缓存中获取到空数据,而不需要查询数据库。
缓存无效Key
这种方式可以解决请求的 key 变化不频繁的情况,如果黑客每次构建不同的请求 key,不仅不能解决缓存穿透问题,还会导致 Redis 中缓存大量无效的 key 。很明显,这种方案并不能从根本上解决此问题。如果非要用这种方式来解决穿透问题的话,尽量将无效的 key 的过期时间设置短一点。

2.2.3 使用布隆过滤器

布隆过滤器是一个非常神奇的数据结构,通过它我们可以非常方便地判断一个给定数据是否存在于海量数据中。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。

关于布隆过滤器的更多内容,可以参考文章:布隆过滤器有什么用?什么原理?如何使用?

使用布隆过滤器解决缓存穿透问题的方法是:将所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话才会走后续流程。
在这里插入图片描述

2.2.4 接口限流

根据用户或者 IP 对接口进行限流,对于异常频繁的访问行为,还可以采取黑名单机制,例如将异常 IP 列入黑名单。

3 缓存击穿

3.1 什么是缓存击穿?

缓存击穿问题: 缓存击穿是指缓存中的某个热点数据突然失效或过期,此时有大量并发请求同时访问该数据,导致这些请求无法从缓存中获取数据,而直接访问数据库,造成数据库压力剧增,甚至可能导致数据库宕机。缓存击穿通常发生在具有高并发读取请求的热点数据上。
缓存击穿问题

3.2 缓存击穿的解决方法

3.2.1 调整热点数据过期时间

设置热点数据永不过期或设置较长过期时间,避免热点数据突然过期的情况,从根源上解决缓存击穿问题!

应该没人会去随便删除热点数据缓存吧?!

3.2.2 热点数据预热

针对热点数据提前预热,将其存入缓存中并设置合理的过期时间。这也能从根源上解决缓存击穿问题!

比如在秒杀场景中:可以在秒杀活动开始之前,将热点数据加载到缓存中,并设置其过期时间在秒杀结束之后。

3.2.3 控制数据库并发

在缓存失效时使用互斥锁(Mutex)或者分布式锁来保护数据库查询过程,只允许一个线程进行数据库查询,其他线程等待查询结果。

4 缓存雪崩

4.1 什么是缓存雪崩?

缓存雪崩问题: 缓存雪崩是指在缓存中存储的大量数据同时失效或者过期,导致大量请求直接访问数据库获取数据,从而造成数据库负载剧增,甚至引发系统崩溃的现象。

注意:缓存服务器宕机导致的缓存失效也算哦

缓存雪崩

4.2 缓存雪崩的解决方法

4.2.1 针对缓存服务不可用的情况

  • 采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。
  • 限流,避免同时处理大量的请求。
  • 采用多级缓存,例如本地缓存+Redis 缓存的组合,当 Redis 缓存出现问题时,还可以从本地缓存中获取到部分数据。

4.2.2 针对缓存大面积过期的情况

  • 设置缓存数据的过期时间随机性,避免大量数据同时失效。
  • 缓存永不失效(不太推荐,实用性太差)。
  • 缓存预热,也就是在程序启动后或运行过程中,主动将热点数据加载到缓存中。

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

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

相关文章

docker环境下配置cerbot获取免费ssl证书并自动续期

文章目录 实践场景了解certbot查看nginx的映射情况操作目标配置nginx配置的ssl证书设置自动续签 实践场景 本人使用docker部署了一个nginx容器,通过容器卷,实现本地html,ssl,conf和ngiinx容器映射的, 经常需要手动部署…

WPS在表格中填写材料时,内容过多导致表格不换页,其余内容无法正常显示 以及 内容过多,导致表格换页——解决方法

一、现象 1,内容过多导致表格不换页,其余内容无法正常显示 2,内容过多,导致表格换页 二、解决方法 在表格内右击,选择表格属性 在菜单栏选择行,勾选允许跨页断行,点击确定即可 1&#xff0…

react+antdMobie实现消息通知页面样式

一、实现效果 二、代码 import React, { useEffect, useState } from react; import style from ./style/index.less; import { CapsuleTabs, Ellipsis, Empty, SearchBar, Tag } from antd-mobile; //消息通知页面 export default function Notification(props) {const [opti…

Kafka学习笔记(三)Kafka分区和副本机制、自定义分区、消费者指定分区

文章目录 前言7 分区和副本机制7.1 生产者分区写入策略7.1.1 轮询分区策略7.1.2 随机分区策略7.1.3 按key分区分配策略7.1.4 自定义分区策略7.1.4.1 实现Partitioner接口7.1.4.2 实现分区逻辑7.1.4.3 配置使用自定义分区器7.1.4.4 分区测试 7.2 消费者分区分配策略7.2.1 RangeA…

【MySQL】常见的SQL优化方式(二)

目录 1、limit 优化 (1)延迟关联(索引覆盖子查询) (2) 已知位置查询 2、group by 优化 (1)使用索引 (2)避免排序 (3)分析查询 …

LeetCode[中等] 739. 每日温度

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 思路 栈 暴力法为遍历列…

毕业论文不会写?教你如何利用AI来帮我完成初稿

AI是个工具,它能帮你提高效率,但可不能完全替代你的工作。所以,你要做的是学会如何利用AI来辅助你的毕业论文写作。 writehelp智能写作辅导:可节约1000小时写作时间帮助快速完成初稿的撰写。 传送门:http://www.write…

Qt Linguist手册-翻译员

翻译人员 Qt Linguist 是为 Qt 应用程序添加翻译的工具。一旦安装了 Qt,就可以像开发主机上的其他应用程序一样启动 Qt Linguist。 Qt Linguist 主窗口包含一个菜单栏和以下视图: 上下文 (F6) 用于从上下文列表中选择要翻译的字符串。字符串 (F7) 用于…

软考中级网络工程师下午题近五年笔记

刷题地址:软考达人—专业的软考刷题题库,软考历年真题,软考模拟考试,软考考前押题。柴丁科技 (ruankaodaren.com) 上面这个网站有的图不清晰,也可以看这个网站策未来网校——在线刷题、智能刷题 (ceweilai.cn) 2019…

[leetcode] 71. 简化路径

文章目录 题目描述解题方法栈java代码复杂度分析 题目描述 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 / 开头),请你将其转化为 更加简洁的规范路径。 在 Unix 风格的文件系统中规则如下&#xff1…

springboot+大数据+基于协同过滤算法的校园食堂订餐系统【内含源码+文档+部署教程】

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

25:stm32的低功耗模式

低功耗模式 1、PWR电源控制2、低功耗模式 1、PWR电源控制 PWR(Power Control)电源控制。PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能,这里我们只学习低功耗模式的功能,低功耗模式…

【AI】AIOT简介

随着技术的快速发展,人工智能AI和物联网IoT已经成为当今最热门的技术领域。AIOT是人工智能和物联网的结合,使物联网设备更加智能化,能够进行自主决策和学习的技术。 通过物联网产生、收集来自不同维度的、海量的数据存储于云端、边缘端&#…

Netty源码-业务流程之写数据

Netty基本介绍,参考 Netty与网络编程 1、源码分析,EchoServerHandler之Write流程 1.1 write流程入口 通常我们通过ChannelRead收到消息后,需要给一个响应,通过ctx.write()将响应返回客户端。 在自定义handler的channelRead方法…

极限电流型氧传感器的工作原理以及有哪些应用场景?

极限电流型氧传感器的工作原理: 极限电流型氧传感器的工作原理基于稳定ZrO2固体电解质的氧泵作用。在已稳定化ZrO2两侧被覆铂电极,阴极侧用有气体扩散孔的罩接合,形成阴极空腔。在一定的温度下,当ZrO2电极两侧加一定电压时&#…

使用AOP处理参数

说明:在一些时候,我们需要在接口介绍到参数前处理参数,像参数校验、参数转换等,本文介绍如何使用AOP来实现此需求。 场景 需求:有一批开放给第三方调用的接口,之前传递的都是用户表的ID,现在需…

vscode 内网不联网如何导入vscode插件

如果有小伙伴百度到这篇文章,那一定是遇到了在内网开发不能联网的问题,那就往下看看吧。 安装一个新的Visual Studio Code,需要必要的一些插件,但是不能联网,于是自带的扩展程序安装便不能用了。 1、在一台能访问外网…

Kali Linux入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。

作为一名从事渗透测试的人员,不懂Kali Linux的话,就out了。它预装了数百种享誉盛名的渗透工具,使你可以更轻松地测试、破解以及进行与数字取证相关的任何其他工作。 今天给大家分享一套Kali Linux资料合集,包括12份Kali Linux渗透…

数据结构-栈(理解版)

一、栈的定义 相信大家对于栈或多或少有一些了解,可能大多数人会告诉你栈是一种先进后出的数据结构。这其实说了跟没说一样(❁◡❁)!当然(last in,first out)是栈最有特色的性质。 这里可以给大家一些比较好理解的例…

车辆重识别(改进的去噪扩散概率模型)论文阅读2024/9/29

所谓改进的去噪扩散概率模型主要改进在哪些方面: ①对数似然值的改进 通过对噪声的那个方差和T进行调参,来实现改进。 ②学习 这个参数也就是后验概率的方差。通过数据分析,发现在T非常大的情况下对样本质量几乎没有影响,也就是说…