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

在项目中,通常会使用数据库比如 MySQL 存储应用数据,但是当数据太多之后,比如多了几十万条或上百万条的商品信息,这个时候查询商品数据的速度会很慢,影响用户体验。此时一般我们会选择将部分商品信息缓存起来,提高商品的查询速度,比如使用 Redis 将明天参加秒杀活动的商品提前缓存起来,用户直接访问到缓存。速度不会很慢,也不会对数据库产生太大压力。

不过,Redis 缓存也会出现问题,最常见的 缓存雪崩、缓存穿透、缓存击穿。

缓存雪崩

在某个时间点,缓存出现的大量失效的情况,导致大量的数据直接请求到了数据库,就像雪崩一样,给数据库造成巨大压力。或者 Redis 突发故障,请求直接到了数据库,同样会造成数据库压力激增,甚至直接崩溃。比如夏天到了,很多人在电商软件上挑选短袖等,需要频繁访问,频繁查询商品的信息。假如突然缓存失效了,大量查询的请求直接请求到了后端数据库,造成了缓存雪崩。数据库承受不住这么大的压力崩溃了,那么用户就不能再进行挑选商品。

e61084a7b3a941cf83d1a7c12401942d.png

解决方案

针对大量同时过期

1. 设置不同的,或者随机的过期时间,避免出现同时过期的情况。

2. 多级缓存。比如本地缓存和分布式缓存相结合,减少单点故障风险。

3. 缓存预热。系统提交将数据预热到缓存中。

4. 加锁。保证只能一个请求能访问到数据库,等到该请求同时在缓存中创建数据之后,其他请求直接访问到缓存。

5. 接口限流,避免同时处理大量请求。

针对中间件故障可以使用集群。

 

缓存击穿

针对某一热点数据在一个时间点在处理大量请求时突然失效,导致直接请求到数据库。比如说某款热点电子产品需要到点秒杀,此时缓存失效了,大量秒杀请求打在数据库上,导致压力激增。

和缓存雪崩的区别,缓存击穿针对的是某个热点 key,缓存雪崩针对的是多个 key。

b068da826a8d4cdc82eccbed0173ea83.jpg

 解决方案

1. 缓存失效时间。热点缓存可以设置超过活动期间的时间,或者直接不设置过期时间,避免活动中途出现缓存实现。

2. 加锁。和缓存雪崩一样,如果已经出现了大量请求访问到后端时,通过加上互斥锁,确保只有一个请求能访问到数据库,然后其他请求等待这个请求将数据构建到缓存之后直接从缓存提取。

 

缓存穿透

针对缓存和数据库中不存在的数据。因为缓存不存在,每次请求都是直接访问数据库,导致数据库负载增加。会有攻击者通过构造不存在的key发起大量请求,造成系统崩溃。

51492c6e567a4108a448f276c1951738.jpg

 

解决方法

1. 无论什么情况,提前做好参数检验比如 主键 id<0直接返回错误,身份证号码位数不对直接返回错误等。

2. 接口限流。避免同时处理大量请求,并且可以设置黑名单,对频繁请求的账号做黑名单处理。

3. 缓存空值。将没有查询到的数据缓存一个空值返回给客户端,下次直接访问空值缓存。

4. 布隆过滤器。

 

 

 

 

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

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

相关文章

JavaSE基础小知识Ⅱ(很容易错!!!)

1. 变量被final修饰后不能再指向其他对象,但可以重写 如果是引用变量被final修饰,那么的确如此; 基本变量不能重写 2. 下列代码的输出结果是? public class Test {static {int x 5; }static int x,y; public static void ma…

java--io流(二)

一、打印流(PrintStream[字节]、PrintWriter[字符]) (基本上可以代替前面所学的字节、字符输出流),二者关于打印数据功能相同(都方便且高效),但是关于数据写出不同,前者…

数据的均匀化分割算法(网格划分法、四叉树法(含C++代码))

数据的均匀化分割主要是指在分割过程中尽可能均匀地将数据点分布在各个子区域中,以保持数据分布的平衡和优化数据结构的性能。以下是几种可以实现数据均匀化分割的方法: 一. 网格划分法 1. 基本概念 虽然传统的网格划分法不是动态调整的,但通…

3款超好用的智能AI写作神器,不容错过!

在当代写作领域,人工智能(AI)辅助的写作工具已显著地改变了创作过程,不仅优化了撰写效率还提高了内容质量。为了协助读者更好地了解并利用这些先进的工具,本文将详细评述3种卓越的AI驱动的写作辅助软件,每一…

AJ65SBT2B-64DA 三菱CC-Link D/A转换模块

AJ65SBT2B-64DA 是将数字值(16位有符号BIN数据)转换为模拟值(电压或电流)的模块。 AJ65SBT2B-64DA参数说明:4通道;输入分辨率0~12000,-12000~12000,-16000~16000;输出DC-10~10V,DC0~20mA;转换速…

028.实现 strStr()

题意 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 难度 简单 示例 例 1 输入:hays…

【Win10点击任务栏刷屏,卡死转圈(亲测有效)】

计算机疑难杂症001 Win10点击任务栏刷屏,卡死转圈(亲测有效)1、问题状况2、问题原因3、问题解决 Win10点击任务栏刷屏,卡死转圈(亲测有效) 1、问题状况 在偶然间,发现任务栏点不动了,点击无反应,再多点击几次&#x…

网络爬虫概述与原理

网络爬虫概述与原理 网络爬虫简介狭义上理解功能上理解常见用途总结 网络爬虫分类通用网络爬虫聚焦网络爬虫增量网络爬虫深度网络爬虫 网络爬虫流程网络爬虫采集策略深度有限搜索策略广度优先搜索策略 网络爬虫简介 通过有效地获取网络资源的方式,便是网络爬虫。网…

Threejs Shader动态修改Merge合并几何体中单个Mesh的颜色

目录 Merge合并 现象 思路 实现 为单个geometry添加映射 通过id检索Merge后的Geometry映射属性,获取顶点坐标 onBeforeCompile修改编译前材质的着色代码 编译前材质的顶点着色代码 编译前材质的片元着色代码 着色器代码 注意 效果 Merge合并 mergeBuf…

【GESP】2023年12月图形化二级 -- 小杨报数

小杨报数 【题目描述】 小杨需要从 1 1 1到 N N N报数。在报数过程中,小杨希望跳过 M M M的倍数。例如,如果 N 5 N5 N5, M 2 M2 M2,那么小杨就需要依次报出 1 1 1, 3 3 3, 5 5 5。 默认小猫角色和白色背…

数据库提权

1.此时实验需要用到的软件: (1)phpStudy该程序包集成最新的ApachePHPMySQL phpMyAdminZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境.该程序不仅包括PHP调试环境,还包括了开发工具、开发手册等.总之学习PHP只需…

Android 逆向

一、apk 查壳工具 ApkScan-PKID 相关APK文件可以在 豌豆荚 官网下载 ApkScan-PKID查壳工具 下载 - 简书 (jianshu.com) 二、脱壳工具:frida 1、Android端配置 frida-server: 该步骤需要使用到 adb,操作Android文件 Releases frida/frid…

对话NVIDIA英伟达:AI已照进现实 | 最新快讯

文 | MetaPost NVIDIA 创始人兼首席执行官黄仁勋在 GTC 2024 主题演讲上表示:下一波 AI 浪潮将是 AI 对物理世界的学习。 当下,全球范围内价值超过50万亿美金的行业正在竞相实现数字化,数字孪生技术正在赋能千行百业。NVIDIA Omniverse 中国…

TriDet: Temporal Action Detection with Relative Boundary Modeling

标题:TriDet:采用相对边界建模的时间动作检测 原文链接:TriDet: Temporal Action Detection With Relative Boundary Modeling (thecvf.com)https://openaccess.thecvf.com/content/CVPR2023/papers/Shi_TriDet_Temporal_Action_Detection_W…

笔试强训未触及题目(个人向)

1.DP22 最长回文子序列 1.题目 2.解析 这是一个区间dp问题,我们让dp[i][j]表示在区间[i,j]内的最长子序列长度,如图: 3.代码 public class LongestArr {//DP22 最长回文子序列public static void main(String[] args) {Scanner…

MSP430环境搭建

1.下载ccs编译器 注意:安装路径和工作路径不能出现中文! 没有说明的步骤就点next即可! 1.1下载适合自己电脑的压缩包。 下载好压缩包后解压,点击有图标进行安装。 1.2创建一个文件夹用于安装编译器位置 选择安装地址&#xff0…

新书速览|Rust编程与项目实战

掌握Rust编程基础和开发方法,实战网络编程、图像和游戏开发、数据分析项目 本书内容 Rust是一门系统编程语言,专注于安全,尤其是并发安全,它也是支持函数式、命令式以及泛型等编程范式的多范式语言。标准Rust在语法和性能上和标准…

贝壳面试:MySQL联合索引,最左匹配原则是什么?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 1.谈谈你对MySQL联合索引的认识? 2.在MySQ…

信创 | 高效信创项目管理:关键步骤与实用技巧!

高效信创项目管理的关键步骤与实用技巧可以从多个维度进行分析和总结。首先,建立有效的工程管理体系是确保信创项目顺利实施的基础,这包括项目管理、质量管理、成本控制等方面的工作。其次,实现项目全流程精细化管理,如信息的及时…

使用./build.sh编译ORB_SLAM源码时出现报错:/usr/bin/ld:找不到 -lboost_serialization的解决办法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、/usr/bin/ld:找不到 -lboost_serialization1.问题描述2.解决(1). 下载源码(2) . 编译安装 一、/usr/bin/ld:找不到 -lboost_serialization 1.问题描述 在安装…