redis-缓存崩溃

news/2024/10/5 23:30:33

缓存崩溃

作者:w08e

redis实战之各种崩溃 雪崩 击穿 穿透 以及预热

缓存雪崩

回答话术

缓存雪崩是应用系统指在某个时间点上,缓存中的大部分数据同时失效,导致大量的请求直接访问底层数据库或后端服务,从而造成数据库负载剧增,甚至导致数据库崩溃的情况。

image.png

通常情况下,缓存中的数据会设置不同的过期时间,以避免同时失效的情况。然而,如果某个不可控的事件导致了大量缓存同时失效,就会出现缓存雪崩。

需要从以下几个方面去解决缓存雪崩问题:

1. 设置不同的过期时间

可以通过设置随机过期时间或者固定过期时间引入随机偏移量两种方案,一定程度上缓解缓存雪崩问题。,集群部署也可以把热点数据放到不同的服务。

2. 缓存预热

在系统启动或者某个特殊节点前,将热门数据预先加载到缓存中,避免在高并发或者其他情况数据不在缓存还需额外请求数据库加载的情况。

3. 设置部分key永不过期

对于一些热点数据,可以设置永不过期,以保证这部分数据始终在缓存中可用。同时,需要保障缓存设置的内存淘汰策略是不淘汰或者从带过期时间 Key 中去淘汰。

  • 电商系统:比如需要参加秒杀的商品数据,我们为了避免因设计过期时间自动过期或者不合适的 Redis 过期策略自动清楚,需要将参与秒杀的商品数据直接设置为永不过期。

缓存穿透

回答话术

缓存击穿指在高并发的系统中,一个热点数据缓存过期或者在缓存中不存在,导致大量并发请求直接访问数据库,从而给数据库造成巨大压力,甚至可能引起宕机。

具体来说,当某个热点数据在缓存中过期时,如果此时有大量并发请求同时访问这个数据,由于缓存中不存在,所有请求都会直接访问数据库,导致数据库负载急剧增加。

image.png

一般来说,解决缓存击穿的主要方法分为三种:热点数据永不过期、热点数据预加载以及加分布式锁

1. 热点数据预热

在活动开始之前,就将已知热点数据加载到缓存中,避免出现第一次请求直接打到数据库的情况。

2. 数据永不过期

热点数据永不过期,指的就是可以预知的热点数据,在活动开始前,设置过期时间为 -1。这样的话,就不会有缓存击穿的风险。

这个可以搭配热点数据预加载一起完成。等对应热点缓存的活动结束后,这些数据访问量就比较低了,可以通过后台任务的方案对指定缓存设置过期时间,这样可以有效降低 Redis 存储压力。

3. 分布式锁

分布式锁的解决方案就是保证只有一个请求可以访问数据库,其它请求等待结果。这样可以避免大量的请求同时访问数据库。

ps: 分布式锁需要注意双检查,也就是获取到锁后需要再次尝试从缓存中获取数据,避免等待锁的请求再次查询db。

特殊情况也可以考虑trylock直接报错 而不是一直阻塞等待锁。

缓存击穿

回答话术

缓存穿透是指由于请求没有办法命中缓存,因此就会直接打到数据库,当请求量较大时,大量的请求就可能会直接把数据库打挂。

通常情况下,缓存是为了提高数据访问速度,避免频繁查询数据库。但如果攻击者故意请求缓存中不存在的数据,就会导致缓存不命中,请求直接访问数据库。

image.png

简单的情况 比如数据主键是自增的,如果某个请求是负数或者id为特别大的,缓存没有 大量请求到db 有可能给db打挂。

缓存穿透通常有几种解决办法: 参数检验空值缓存、锁、布隆过滤器;

1. 参数校验,空值缓存

对一些非法的参数做一些校验,比如-1直接 return了 不去查询redis或者db,

当查询结果为空时,也将结果进行缓存,但是设置一个较短的过期时间。这样在接下来的一段时间内,如果再次请求相同的数据,就可以直接从缓存中获取,而不是再次访问数据库,可以一定程度上解决缓存穿透问题。

不过这种方式也有小问题,这种方式同时也会在短时间内会造成缓存系统大量的内存占用,彻底解决这种海量恶意请求还是需要一套风控系统。

2. 加锁

当请求发现缓存不存在时,可以使用锁机制来避免多个相同的请求同时访问数据库,只让一个请求去加载数据,其他请求等待。

这种方式可以解决数据库压力过大问题,如果会出现“误杀”现象,那就是如果缓存中不存在但是数据库存在这种情况,也会等待获取锁,用户等待时间过长,不推荐使用。

3. 布隆过滤器

布隆过滤器是一种数据结构,可以用于判断一个元素是否存在于一个集合中。它可以在很大程度上减轻缓存穿透问题,因为它可以快速判断一个数据是否可能存在于缓存中。

这种方式较为推荐,可以将所有存量数据全部放入布隆过滤器,然后如果缓存中不存在数据,紧接着判断布隆过滤器是否存在,如果存在访问数据库请求数据,如果不存在直接返回错误响应即可。

简单来说他因为你对你不一定对 存在误差率,但是他认为你错就一定错。

5. 组合使用 布隆过滤器+空对象+分布式锁

上面的这些方案或多或少都会有些问题,应该用三者进行组合用来解决缓存穿透问题。

如果说缓存不存在,那么就通过布隆过滤器进行初步筛选,然后判断是否存在缓存空值,如果存在直接返回失败。如果不存在缓存空值,使用锁机制避免多个相同请求同时访问数据库。最后,如果请求数据库为空,那么将为空的 Key 进行空对象值缓存

缓存预热

聊完缓存常见的问题,现在聊聊预热,上面三个常见问题雪崩和击穿都可以通过预热解决,让我们分析一下。

回答话术

缓存预热是在系统启动或者运行过程中,提前将部分数据加载到缓存中,以确保在实际请求到来时,缓存已经包含了部分常用数据,从而提升系统的响应速度。

image.png

可以使用项目启动预热 或者xxjob定时或者把需要预热的消息放到消息队列然后通过消费者线程从消息队列中获取数据,并执行相应的数据读取流程最终存储到 Redis 中。

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

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

相关文章

redis-持久化

redis 数据持久化 作者:w08e数据持久化三连问redis 宕机数据会丢失吗 回答话术 先说结论,如果我们没开启任何持久化机制,那么会丢失全部数据,否则只会丢失部分数据,丢失数据的多少取决于持久化配置。Redis 提供了两套持久化机制,RDB 快照和 AOF 日志文件追加。 RDB 它会根…

Guava工具总结

Table双键Map public class OTest {public static void main(String[] args) {Map<String, Map<String, Integer>> map = new HashMap<>();//存放元素Map<String, Integer> workMap = new HashMap<>();workMap.put("Jan", 20);workMap…

B 端产品未来几年的发展趋势XG

在当今数字化高速发展的时代,B 端产品经理作为企业数字化转型的关键推动者,肩负着重大的责任。不仅要深入了解企业的业务需求,还要紧跟技术发展的步伐,为企业提供高效、创新的解决方案。那么,未来几年,B 端产品领域将会呈现出哪些发展趋势呢?一、人工智能与机器学习的深…

Clobotics 计算机视觉场景存储实践:多云架构、 POSIX 全兼容、低运维的统一存储HB

Clobotics 是一家将计算机视觉和机器学习技术应用于风电以及零售行业的企业。在风电行业,Clobotics 利用无人机对风力发电机叶片进行检查,显著降低了对人工作业的依赖。在零售领域,公司通过分析捕获的包装商品图像来提供基于实时数据的洞察,以增加销售额并减少运营成本。 存…

uni-app之camera组件-人脸拍摄i6

小程序录制视频;10-30秒;需要拍摄人脸,大声朗读数字(123456)这种。 1.camera组件 camera页面内嵌的区域相机组件。注意这不是点击后全屏打开的相机 camera只支持小程序使用;官网链接1.2 效果图1.3 页面布局 camera 设置宽100%,高度通过uni.getSystemInfo获取,全屏展示。…

怎样打开windows自动更新,打开电脑更新的步骤及方法

清理C盘是维护电脑性能的重要步骤,但需要注意方法以避免对电脑造成不良影响。以下是一份详细的C盘清理教程及方法,旨在帮助您安全有效地释放C盘空间: 一、备份重要数据 步骤:在开始清理前,请确保您已备份C盘上的重要个人文件和系统设置,以防误删或意外情况导致数据丢失。…

GPU虚拟化技术简介:实现高性能图形处理的灵活部署

GPU虚拟化技术是一项重要的创新,通过将物理GPU划分为多个虚拟GPU,实现多用户共享和独立运行图形处理任务的能力。本文介绍了GPU虚拟化技术的基本原理、应用场景和优势。该技术在云计算、虚拟桌面基础设施和科学研究等领域具有广泛应用。GPU虚拟化技术提高了资源利用率、性能和…

二. Spring Boot 中的 “依赖管理和自动配置” 详解透彻到底(附+详细代码流程)sh

二. Spring Boot 中的 “依赖管理和自动配置” 详解透彻到底(附+详细代码流程) @ 目录* 二. Spring Boot 中的 “依赖管理和自动配置” 详解透彻到底(附+详细代码流程)1. 如何理解 “ 约定优于配置 ” 2. Spring Boot 依赖管理 和 自动配置2.1 Spring Boot 的依赖管理2.1.1…