高并发场景

缓存穿透

定义

大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中 。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨大的压力

举个例子

某个黑客故意制造一些非法的 key 发起大量请求,导致大量请求落到数据库,结果数据库上也没有查到对应的数据。也就是说这些请求最终都落到了数据库上,对数据库造成了巨大的压力。

解决办法

①最基本的就是首先做好参数校验,一些不合法的参数请求直接抛出异常信息返回给客户端。比如查询的数据库 id 不能小于 0、传入的邮箱格式不对的时候直接返回错误消息给客户端等等。

②其次,我的项目中采用了缓存无效key(缓存为" "值),为了尽量减少数据不一致的情况,我将无效key的过期时间设置为了1分钟。

缓存雪崩

定义

缓存在同一时间大面积的失效,导致大量的请求都直接落到了数据库上,对数据库造成了巨大的压力。

针对大量缓存同时失效的情况解决办法

①设置随机失效时间(可选):为缓存设置随机的失效时间,例如在固定过期时间的基础上加上一个随机值,这样可以避免大量缓存同时到期,从而减少缓存雪崩的风险。

②提前预热(推荐):针对热点数据(比如我们秒杀业务中的数据)提前预热,将其存入缓存中并设置合理的过期时间,保证在秒杀活动结束前不过期。

测试环境下:我是通过测试类,先进行数据预热,加载进Redis缓存中。

③持久缓存策略(看情况):虽然一般不推荐设置缓存永不过期,但对于某些关键性和变化不频繁的数据,可以考虑这种策略。

缓存击穿

定义

缓存击穿中,请求的 key 对应的是 热点数据 ,该数据 存在于数据库中,但不存在于缓存中(通常是因为缓存中的那份数据已经过期) 。这就可能会导致瞬时大量的请求直接打到了数据库上,对数据库造成了巨大的压力

业务中的场景

秒杀进行过程中,缓存中的某个秒杀商品的数据突然过期,这就导致瞬时大量对该商品的请求直接落到数据库上,对数据库造成了巨大的压力。

解决办法

①逻辑过期(永不过期):设置热点数据永不过期

②加同步锁:在缓存失效后,通过设置互斥锁确保只有一个请求去查询数据库并更新缓存。

如果是追求数据的一致性,可以容忍性能的话,建议使用加锁的方式

如果是追求性能,对数据的一致性可以容忍的话,建议使用逻辑过期的方式

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

缓存穿透中的数据即不存在缓存中,也不存在数据库中。

缓存击穿中的数据不存在缓存中(过期了),但存在数据库中。

相关推荐
evans在进步1 天前
LeetCode 198:打家劫舍——Java 动态规划详解
java·leetcode·动态规划
ZJU_统一阿萨姆1 天前
【推理优化进阶】性能实验科学:工作负载、统计显著性与尾延迟归因
开发语言·人工智能·语言模型·系统架构·vllm
Hhy_11071 天前
《C++深度解构02》类和对象(上)——定义规范、内存对齐与 this 指针全解
c语言·开发语言·c++·学习·visual studio
2601_963870221 天前
【计算机毕业设计】基于Spring Boot的考研信息交流平台的设计与实现
java·spring boot·后端
电子云与长程纠缠1 天前
UE5 Lyra PocketWorld进行3D内容UI预览 - 下
开发语言·学习·游戏·ui·ue5
大模型丫丫1 天前
Spring Boot 入门指南:从零开始构建你的第一个应用
java·spring boot·后端
拾光Ծ1 天前
Linux五种I/O模型与fcntl非阻塞控制
java·linux·服务器·i/o模型
半旧5181 天前
【Java Web02】WEB服务器内部实现技术揭秘
java·服务器·前端
gis开发之家1 天前
日志怎么打才专业?Spring Boot 4 日志体系与 Logback 配置(生产级实战)
java·spring boot·后端·logback
平常心的技术小牛1 天前
Qt-快速上手-QLabel
开发语言·qt