【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?--主从切换方案

简介: 【5月更文挑战第16天】该方案提出了解决Redis缓存穿透、击穿和雪崩问题的策略。通过使用两个或多个互为备份的Redis集群,确保在单个集群故障时,另一个可以接管。在故障发生时,业务会与备用集群保持心跳检测,并根据业务重要性分批转移流量,逐步增加对备用集群的依赖,同时监控系统稳定性。对于成本敏感的小型公司,可以采用低成本的单机或小规模自建Redis备份。此方案强调渐进式流量转移,以保护系统免受突然压力冲击。

亮点方案

不管是换成你穿透、击穿还是雪崩,归根结底都是请求都落到了数据库上。除了这三个异常,Redis本身也可能崩溃,又或者因为网络问题连不上这个集群。集群互为备份这个亮点方案可以很好的解决这个问题。

很多大厂会用一些异地多活的方案,就是使用两个 Redis 集群,然后两个集群之间要保持数据同步。那么其中一个 Redis 集群崩溃的时候,就可以用另外一个 Redis 集群。

但是,这个方案太高端了,不在大厂的话很难接触到。所以我给你准备一个比较低端但是更加容易落地的方案。这个方案的思路还是用两个或者多个 Redis 集群,但是你不会让这些集群之间保持数据同步。比如说你可以在两个云服务厂商上购买两个不同的 Redis 服务,然后尽可能让核心业务访问不同的集群。
2024-05-18-23-12-14-image.png

假设说我有两个业务,那么我准备两个 Redis 集群,业务 1 主要用集群 1,集群 2 作为备份。业务 2 主要使用集群 2,集群 1 作为备份。

具体思路是这样的:

第一,业务 1 会和集群 1 保持心跳。当发现连不上 Redis 之后,就可以执行容错方案,这个时候业务 1 会保持和集群 1 的心跳。

第二,触发容错之后,业务 1 根据流量价值分成两部分。对于非核心业务来说,直接触发熔断,不会查询集群 2,也不会查询数据库,这是舍小保大。对于核心业务来说,按照预先设置的流量比例,查询集群 2,并回查数据库,其余请求一样熔断。如果当前流量比例查询集群 2 没有引起任何的问题,数据库也没有问题,那么就增大流量比例。

第三,当集群 1 重新恢复心跳之后,业务 1 还是逐步把集群 2 上的流量转发到集群 1 上。
2024-05-18-23-12-58-image.png

你可以进一步总结这个思路的要点,就是渐进式

在触发容错之后,没有立刻把全部流量转发到集群 2 上,是因为担心集群 2 会撑不住,所以要逐步转发流量,每次转发之后发现没问题就可以调大比例。转发回集群 1 也是这样,因为和集群 1 刚恢复通信的时候,集群 1 上面什么数据都没有,而这个时候集群 2 还能用,所以不着急立刻转发回来,先小规模流量重建集群 1 上的数据。

那么为什么互为备份可行呢?因为正常 Redis 集群都有很大的余量,在遇到问题的时候互为备份顶一下就可以。当技术人员发现问题之后,会紧急采购新的 Redis 服务,或者部署新的集群接替集群 1。所以集群 2 大概率会在高负载状态下运行一段时间。

如果你面试的是比较小型的公司,对成本比较敏感,你就可以补充一个变种,关键词是凑合用便宜货。

如果觉得两个 Redis 集群服务太贵,那么也有一个低成本方案,公司可以自己部署一个小规模的 Redis 集群,甚至单机 Redis 作为所有业务的备份。这个 Redis 集群不要求高可用,对它的唯一要求就是撑住我线上集群的核心流量一段时间就可以。毕竟,不管这个备份集群有多差,都比完全没有要好。
2024-05-18-23-13-46-image.png

这里还有一些细节问题。

第一个是最开始按多少比例转发到集群 2 上比较合适,答案是这个初始流量的大小就是你业务数据库能撑住的流量大小。因为一开始转发到集群 2 上的流量,肯定都是缓存未命中的,也就是要回查数据库,所以数据库决定了这个初始流量。

第二个问题是后续流量要怎么放开。答案是你可以自由选择,按照比例增长、线性增长都可以。但是原则是要保守,因为你万一把集群 2 弄崩溃了,业务损失就更大了。

第三个问题就是怎么判定 Redis 已经崩溃了,或者恢复过来了?这个问题你在微服务部分已经多次遇到了,思路都是一样的,这里我就不重复了。

目录
相关文章
|
11月前
|
缓存 数据库连接 数据库
缓存三剑客(穿透、击穿、雪崩)
缓存穿透指查询数据库和缓存中都不存在的数据,导致请求直接冲击数据库。解决方案包括缓存空对象和布隆过滤器。缓存击穿是大量请求访问同一个失效的热点数据,使数据库瞬间压力剧增,解决方法有提前预热、设置永不过期、加锁限流等。缓存雪崩是大量key同时失效,导致所有请求直达数据库,可通过引入随机过期时间缓解。三者分别对应单点爆破、全面崩塌等问题,需根据场景选择合适策略优化系统性能与稳定性。
596 0
|
11月前
|
存储 缓存 NoSQL
如何解决缓存击穿?
缓存击穿是指热点数据失效时大量请求直接冲击数据库,可能导致系统崩溃。解决方案包括:永不过期策略避免缓存失效瞬间的穿透;互斥锁控制并发访问;热点预热提前刷新缓存;熔断降级在数据库压力大时返回默认值;二级缓存降低Redis压力。实际中常组合使用多种方案,如热点预热+互斥锁+熔断降级,以提升系统稳定性与性能。
1287 0
|
8月前
|
缓存 并行计算 监控
vLLM 性能优化实战:批处理、量化与缓存配置方案
本文深入解析vLLM高性能部署实践,揭秘如何通过continuous batching、PagedAttention与前缀缓存提升吞吐;详解批处理、量化、并发参数调优,助力实现高TPS与低延迟平衡,真正发挥vLLM生产级潜力。
2082 0
vLLM 性能优化实战:批处理、量化与缓存配置方案
|
9月前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
357 5
|
10月前
|
缓存 运维 安全
WordPress安全加速:Cloudflare + Nginx缓存优化方案
本文介绍如何通过Cloudflare与Nginx优化WordPress网站性能,涵盖静态资源长期缓存、动态页面智能缓存及敏感路径保护,提升加载速度并保障后台安全。适用于使用Cloudflare与Nginx环境的WordPress站点。
432 0
|
10月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
722 0
|
11月前
|
缓存 NoSQL 数据库
什么是缓存击穿
缓存击穿是指热点缓存key突然失效,导致大量并发请求直接冲击数据库,造成巨大压力。常见于高并发场景,如热门商品信息失效时。解决方法包括设置热点key永不过期、使用分布式锁、预热数据、熔断降级等,以保障系统稳定性。
970 0
|
11月前
|
缓存 数据库
如何解决缓存穿透?
对请求增加校验机制,如ID格式和位数校验,避免无效请求;缓存空值或特殊值防止缓存穿透;使用布隆过滤器拦截不存在的请求,减轻数据库压力。
197 0
|
缓存 监控 NoSQL
Redis--缓存击穿、缓存穿透、缓存雪崩
缓存击穿、缓存穿透和缓存雪崩是Redis使用过程中可能遇到的常见问题。理解这些问题的成因并采取相应的解决措施,可以有效提升系统的稳定性和性能。在实际应用中,应根据具体场景,选择合适的解决方案,并持续监控和优化缓存策略,以应对不断变化的业务需求。
2220 29
|
缓存 数据库
什么是缓存击穿 ? 怎么解决 ?
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大 解决方案 : ● 热点数据提前预热 ● 设置热点数据永远不过期。 ● 加锁 , 限流

热门文章

最新文章