一种基于“哨兵”的分布式缓存设计

Java如何打造分布式缓存的“永生不灭”?揭秘5大高可用性设计技巧! 摘要:本文通过四大技术方案解决Redis高可用性问题: 1️⃣ 主从复制配置(C#实现),实现数据热备份; 2️⃣ 哨兵机制自动故障转移,保障服务连续性; 3️⃣ 一致性哈希分片算法(含虚拟节点),优化负载均衡; 4️⃣ 连接池优化策略提升吞吐量。采用技术类比(如"钢铁侠装甲"比喻哨兵机制)生动解析复杂概念,提供完整代码示例,助开发者构建抗故障、高性能的缓存系统。 关键词:Redis高可用、主从复制、哨兵模式、一致性哈希、连接池优化 阅读详情

14年双11大促缓存方案,今天有点闲暇时间,回顾一下当时的思路。

场景介绍:

大促活动下,对于某些产品进行整点秒杀活动。预计流量是平时峰值5+倍。

商品计算逻辑比较复杂:某个最终展示的商品属性和价格,可能需要上亿次动态条件计算获得,动态条件每时每刻都在变化,并且商品的库存属性属于行业共有库存,每时每刻都在变化。

计算模型:前端机并发去后端获取实时计算数据,然后合并结果,根据用户信息给商品打属性,排序。

头脑风暴

针对这种场景,有很多方案可以尝试,不过总结起来,大概俩个方向:扩容和缓存。

扩容

扩容是最容易想到的方式,而且每年大促,根据压测和运营活动预期,都可能有相应扩容。扩容从某种程度上说,也是最简单的方式,如果应用规划足够好,没有状态,那么基本不用开发介入就能完成。

但是如果应用涉及状态信息,那么扩容就没有说的那么轻巧,扩容涉及到增加集群状态;活动结束后,机器下线涉及集群减少状态,这一增一减,增加了运维的成本和系统稳定性。

扩容还有一个不好的地方就是活动结束后,系统水位下降,闲下来4倍的机器,比较浪费。

缓存

相对扩容,缓存是一种从应用角度出发,优化系统的方案。缓存的方案可细分不同粒度,分别适用不同场景。

静态化

静态化能最大限度降低最大限度降低后端压力,一般静态内容可以定时或者通过数据更像触发生成,然后推送到CDN节点。静态化适用于1)读多写少的数据,或者2)能够容忍数据变化延迟的场景。对于本文介绍的场景,并不适合,原因在于商品不满足前面说的两点,并且每个登陆用户看到的产品价格和属性是不同的。

缓存中间结果

静态化这种”一刀切”模式,不能满足针对每个用户的个性化展示需求,如果把每个用户看到的数据都静态化,那缓存的命中率有会很低,基本每个用户请求一两次就不会再来了。而且缓存数据量巨大。

由此想到把缓存粒度缩小,把缓存从展示层后推到前端机上。因为前端机负责汇总后端结算结果,并根据用户信息给商品打属性,排序。

缓存方案尝试

经过头脑风暴,最终确定采用缓存中间结果方式。接下来讨论一下方案细节。

简单粗暴方式

如果缓存有数据,取缓存数据,如果没有,请求后端并把结果更新到缓存。这是一种最简单的缓存模式,但不幸的是不适合秒杀场景,因为秒杀开始的时候,缓存很能没有数据,请求会穿透到后端。

实时缓存,异步更新方式

实时请求数据来自缓存,缓存数据定时异步更新。粗看起来,这个方案不存在缓存穿透的情况,因为数据不会实时从后端计算获取,而是从缓存获取,如果缓存数据存在,直接获取即可。缓存更新可以把用户请求汇总后去重,定时更新。

上面讨论的两种方式都一个共性问题:第一批请求问题:如果第一批请求缓存没有数据怎么办?

简单粗暴的方式会让这样的请求穿透缓存,后端去处理并更新缓存。这样会给后端计算带来压力,秒杀开始那一刹那,很可能支撑不住。

而实时缓存的牺牲了这样的请求,因为这些请求根本看不到数据,所以请求失败。这两种方式在本文的应用场景都不合适。

为何不提前初始化缓存?

的确,上面两个方案如果能在第一批请求到达前初始化好缓存,那基本上可以满足本文的应用场景的。而且看起来也很容易做到,提前模拟一次请求或者提前往缓存放一份数据不就可以了吗?

不幸的是,本文场景因为涉及数据范围巨大,不能在较短时间内遍历缓存key,初始化好缓存,即使采取并发方式。而且,初始化缓存请求过多,也将给后端机器造成压力。

缓存失效又该怎么办?

根据需求,两种方案的缓存不会永久有效,如果缓存失败了怎么办?

对于简单粗暴方式,如果缓存失效,又会遇到第一批请求问题,一批请求发现缓存失效,怎么办?看来即使解决了缓存初始化问题,还有可能导致缓存穿透。

实时缓存模式也有类似问题,如果异步更新前数据已经失效了,那么将牺牲一批数据失效后到更新前这批用户。因为没有人去更新数据。

缓存更新问题

不管哪种方式,分布式缓存更新都存在并发问题,尤其在整点秒杀场景更为突出。对于简单粗暴方式,可以采用分布式锁解决:如果缓存穿透的一批请求只有一个会真正打到后端是不是就可以解决了?

实时缓存也有同样的问题,只不过异步请求可以把一段时间内的重复请求合并成一个,从侧面避免了并发问题。

更好的缓存方式

把上面的讨论结合,可以得到一种更优雅的缓存方案,既不牺牲第一批请求,也不存在缓存穿透问题,同时避免并发更新问题。

哨兵

想象有这样一个哨兵线程,只有它能去后端请求实时数据,并更新缓存。

第一批请求场景:

image

第一批请求中,选取最早的那个请求为哨兵,这个线程不会去读缓存,直接去后端获取计算结果并更新缓存。其他普通线程则自旋+sleep等待,直到哨兵更新缓存后,能拿到数据为止。

缓存失效场景:

image

哨兵的作用是让缓存永不失效。哨兵线程提前苏醒,去后端获取计算数据并更新缓存。这样,其他普通线程根本不会感知到缓存已经失效,他们能一直拿到最新的缓存。

例如,某个key的缓存失效时间的12:00:00,那么哨兵可能在11:59:55的时候苏醒,请求后端并于11:59:57的时候完成缓存数据更新,后续请求线程感知不到数据的更新,一直能取到非过期的数据。

实现细节

哨兵:其实哨兵也是一个普通请求。可以用原子计数器(redis或tair)实现,一个数据有两个key:原子计数器key和数据缓存key,二者缓存时间一致,但是计数器key失效时间比数据key的要早(至少提前一个后端请求RT时间,这样能保证哨兵更新缓存后,不被其他线程感知到)。当请求线程发现缓存没有数据的时候,每个线程去更新计数器,更新后,得到计数器为1的线程,被设置成哨兵线程,其他线程则等待哨兵。

普通请求没有获取到数据的时候,自旋+sleep应该有个超时时间,防止意外情况。如果超时了,根据业务场景选择请求后端数据还是处理失败。

Java分布式缓存高可用性实战:Redis哨兵+Hazelcast集群+Spring Cloud全解析 本文探讨了在高并发场景下,如何构建具备99.999%可用性的分布式缓存系统,重点介绍了Redis哨兵集群、Hazelcast分布式数据网格与Spring Cloud生态的结合应用。文章首先分析了高可用设计的核心优势,强调了Redis哨兵模式的自动故障切换、Hazelcast集群的自我修复与数据分片冗余,以及Spring Cloud生态的断路器与负载均衡功能。随后,通过代码实战详细展示了Redis哨兵模式集群的配置与电商秒杀库存缓存的应用,以及Hazelcast集群的配置与微服务间共享会话缓存的强一致性操作。 阅读详情

相关推荐

WhatsApp网页版扫码分析

扫码登录本质上是WhatsApp的多设备登录,设备之间可以独立运行,那么当我们首次通过WhatsApp扫码登录二维码时,到底发生了那些事情?交换了那些数据?

SocialMarketing的博客 5230

Redis二:哨兵模式与缓存问题

redis哨兵模式与缓存问题(缓存穿透,缓存击穿,缓存雪崩)

fyzzyf的博客 767

从零开始构建量化价值投资多因子模型

量化价值投资多因子模型的构建目的在于通过系统性的方法,综合考虑多个影响股票价值的因素,以更准确地评估股票的投资价值,为投资者提供科学的投资决策依据。本模型的构建范围涵盖了从因子的选取、数据的处理、模型的建立到模型的评估和优化等一系列过程。通过对历史数据的分析和回测,验证模型的有效性和稳定性,进而应用于实际的投资组合管理中。本文将按照以下结构进行组织:首先介绍量化价值投资和多因子模型的相关背景知识,包括核心概念和联系;接着详细阐述核心算法原理和具体操作步骤,并给出Python代码示例;

AI天才研究院 1238

数据结构-排序算法

设有n个记录R[1]~R[n]。 一、插入排序 1. 直接插入排序      直接插入排序是指将R[i]~R[n]插入到已经有序的R[1]~R[i-1]序列中。R[0]是一个哨兵,起到作为边界条件并作为暂存单元的作用。      实际上,一切为简化边界条件而引入的附加节点(元素)均可称为哨兵。例如单链表中的头结点。      对于有n个记录的集合,要进行n-1趟排序。      其

程国华的专栏 997

c++11 无锁队列

/************************************************************************* > File Name: lockfreequeue.cpp > Author: > Mail: > Created Time: Wed 08 Aug 2018 11:38:08 AM CST ********...

qq_35728402的博客 5021

S参数反演法

等效介质理论模型— 利用S参数反演法提取超材料结构的等效参数 等效介质理论模型—利用S参数反演法提取超材料结构的等效参数 S参数反演法,即利用等效模型的传输矩阵和S参数求解超材料结构的等效折射率n和等效阻抗Z的过程。本文对等效介质理论模型进行了详细介绍,并提供对应代码。 超材料的传输矩阵 超材料结构的传输矩阵函数为: 其中,d 为等效光学活性材料的厚度,n 为折射率,Z 表示阻抗。 S参数和传输矩阵T 超材料结构的S参数和传输矩阵T满足下列方程: 利用以上两式,可以得到等效折射率n和相对阻抗的表达式

weixin_43962864的博客 1万+

分布式系统中常用的缓存方案

在设计分布式系统时,选择合适的缓存方案对系统的性能和可伸缩性至关重要。以下是常见的几种缓存方案的概述:常用的缓存架构缓存方案在提升系统性能、减轻后端负载以及改善用户体验方面发挥着重要作用。不同的缓存方案具有各自的优点和缺点,需要根据具体的业务需求和场景来选择合适的方案。内存数据库提供了高性能的数据存储和丰富的数据结构支持,适用于对读写速度要求高的场景;分布式缓存具有良好的可扩展性和高可用性,适用于大规模数据存储和高并发访问的场景;

EverythingAtOnce的博客 1969

VFIO框架源码分析(二十一)- IOMMUFD 模式下的 DMA 映射机制

在虚拟化 I/O 的世界里,无论上层管理面(如对象模型、设备绑定)如何重构,数据面最核心的任务始终未变——DMA 映射(DMA Mapping)。即如何建立 Guest Physical Address (GPA) 到 Host Physical Address (HPA) 的映射关系,并将其填入 IOMMU 的硬件页表中,使得直通设备能够正确访问虚拟机内存。在 Legacy VFIO (Type1) 时代,这一职责由承担,它通过ioctl 操作 Container。

qq_36071928的博客 1007

三分钟带你入门redis高可用架构之哨兵模式,,mysql数据库优化面试题

Redisson是架设在Redis基础上的一个Java驻内存数据网格(In-Memory Data Grid)。充分的利用了Redis键值数据库提供的一系列优势,基于Java实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。

F1814397的博客 1129

【无人机基站】基于K-mean算法实现无人机基站部署附matlab代码

【无人机基站】基于K-mean算法实现无人机基站部署附matlab代码

天天酷科研的博客 240

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

Systemcall名屋 1685

Cortex-M HardFault调试指南:利用SP指针快速定位故障

在嵌入式开发中,Cortex-M内核的HardFault异常调试常因现场信息丢失而困难重重。其原理是异常发生时内核自动将关键寄存器压栈,通过SP指针可获取PC等现场值。掌握SP指针机制能快速定位非法地址访问、栈溢出等故障,提升调试效率。应用场景包括RTOS任务崩溃、中断嵌套错误等。本文深入讲解SP指针在HardFault分析中的核心作用,提供从现场捕获到根因定位的完整实践方法。

weixin_34013044的博客 335

c# 如何使用S7NET 读取汇川H5U的数据

本文介绍了两种使用C#读取汇川H5U PLC数据的方法。第一种通过ModbusTCP协议(推荐),使用NModbus库实现,步骤包括配置PLC的Modbus服务器功能、安装库及编写读取保持寄存器的代码。第二种针对兼容西门子S7协议的型号,使用S7NetPlus库直接读取。文章强调需注意地址映射关系、协议配置及网络设置,并建议优先采用ModbusTCP方案以确保稳定性。两种方法均提供了完整的代码示例,帮助开发者快速实现在C#环境下与汇川H5U PLC的通信。

StevenChen的博客 456

分布式缓存架构设想

背景分析: 当我们需要做一个庞大而又复杂的系统的时候,我们不得不面临这样问题,我们需要的不间断的提供服务,需要处理海量的信息,处理存储海量的数据;为此我们需要将服务器做成无状态服务器,并且利用高可用、高性能的分布式缓存来保存服务器的状态,已达到我们的目的。 当今分布式缓存技术分析: 目前redis、ssdb、memcache都是单机运行,不过,redis已经发展出codis集群和re

wangjin2891的专栏 850

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Microi.net缓存策略:Redis哨兵模式与分布式缓存优化

在现代企业级应用开发中,缓存技术已成为提升系统性能、降低数据库压力的关键手段。Microi.net作为一款开源低代码平台,面临着海量数据处理和高并发访问的挑战。传统的单节点Redis缓存架构在应对大规模用户访问时往往力不从心,容易出现单点故障和性能瓶颈。 本文将深入探讨Microi.net如何通过Redis哨兵模式实现高可用分布式缓存,并提供一套完整的缓存优化策略,帮助开发者构建稳定、高效的企业...

gitblog_01106的博客 759

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

分布式缓存设计的一些思考

分布式缓存设计的思考和改善。

黑伯的博客小站 5257

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

一种基于哨兵的缓存访问策略

一种基于哨兵的缓存访问策略 学习自 一种基于“哨兵”的分布式缓存设计 通常的缓存访问如下,箭头表示访问量,且为同一时刻访问。 如果Redis缓存命中,那么web就不会访问数据库,否则,客户端有N个并发请求就会有N个对数据库的并发请求,伴随而来的可能会是N个Redis SET操作。 为了消除这种情况下多余的请求,减轻数据库压力,引入一个“哨兵”请求,即当缓存不命中时,只有一个请求能落到...

ronon77的专栏 227

从零设计分布式缓存:基于SpringBoot+Redis哨兵的架构演进之路

本文详细介绍了基于SpringBoot和Redis哨兵集群的分布式缓存架构设计,从单节点到高可用集群的演进过程。通过实战案例展示了哨兵集群的部署配置、SpringBoot集成Lettuce客户端实现读写分离,以及多级缓存策略在电商秒杀场景中的应用,帮助开发者构建高性能、高可用的缓存系统。

weixin_29292431的博客 640

分布式缓存选择

分布式缓存的选择和问题 如今,缓存系统的应用非常广泛,能够用来提高并发数、数据吞吐量,提高快速响应能力。那么当数据量达到一定程序,单机环境可能就显得有些力不从心了,就需要一个分布式缓存系统。 1. 缓存系统的选择 ​ 图1-1 如上图所示,首先缓存大致可以分为四大类。 CDN缓存:CDN即内容分发网络,CDN边缘节点将数据缓存起来。 反向代理缓存:如Nginx...

liyifan687的博客 862

【黑马点评 - 高级篇】Redis分布式缓存原理(Redis持久化 RDB AOF + 主从集群 哨兵 分片集群 + 多级缓存)

黑马点评Redis项目学习完整笔记,包含【Redis持久化RDB、AOF】【Redis主从集群、哨兵、分片集群、插槽】 【多级缓存】【JVM进程缓存:Caffeine】【OpenResty】,超详细注释版!

weixin_61639349的博客 1340

后端分布式缓存集群,哨兵模式与Cluster

分布式缓存集群成为解决高性能、高可用问题的关键方案。早期的Redis集群实现主要有两种主流架构:**哨兵(Sentinel)模式**和**Cluster模式**。| **数据分片** | 需要客户端实现 | 原生支持 || **适用场景** | 中小规模集群 | 大数据量场景 |4. **高并发写入**:Cluster模式的多主结构更优。

2509_93946403的博客 418
上一篇: replace into导致mysql自增列导致主键重复问题分析
下一篇: 使用 Redis 实现分布式系统轻量级协调技术
笑天居士
博客等级 码龄24年 292粉丝 136原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值