系统设计 022:券系高并发架构深度剖析
系统设计 022券系高并发架构深度剖析Bilibili 同步视频一、券记录生成规则 两类模式各循章法1.1 领取触发型记录1.2 发放触发型记录流程示意图Mermaid二、券名与券批次️ 内外分野泾渭分明2.1 对外券名2.2 内部批次名对比表格三、热点 Key 问题 流量倾斜之困分流破局之法3.1 问题成因3.2 主流解决方案热点数据分片打散热点 Key 分流原理图Mermaid四、缓存预热️ 读多写少场景前置优化降库压4.1 核心概念4.2 典型业务场景电商秒杀 / 大促领券4.3 缓存预热伪代码Java 风格4.4 写缓存优化Redis Lua 脚本五、消息队列与幂等设计 杜绝消息重复防止优惠券超发5.1 幂等核心定义5.2 幂等 ID 整体架构5.3 幂等执行流程Mermaid5.4 幂等 ID 生成方案5.5 幂等判断核心伪代码六、消息队列与缓存预热⚖️ 功能分野各司其职七、Redis 分布式锁 RedLock️ 突破单机性能瓶颈7.1 优化方案RedLock红锁7.2 技术方案选型原则八、防重复领券️ Redis 集合去重筑牢业务防线8.1 实现原理8.2 执行流程8.3 防重领券伪代码九、总结与感悟 小业务藏大架构 导读每逢电商大促优惠券发放与领取链路便会直面海量流量冲击。从数据落库规则、券标识划分到热点流量倾斜、缓存优化、消息队列幂等防重、分布式锁、防重复领券等一系列经典问题皆是分布式高并发场景下的核心考点。本文以业务落地为根基辅以图文、伪代码、流程拆解以雅致行文结合技术实操全方位拆解优惠券系统架构设计与问题解决方案。Bilibili 同步视频系统设计 022券系高并发架构深度剖析一、券记录生成规则 两类模式各循章法优惠券业务中数据记录表的生成时机历来分为主动发放与被动领取两大范式二者场景相异、逻辑有别一静一动各司其职。1.1 领取触发型记录 适用场景用户自主点击领券、活动页手动领取优惠券逻辑要义无领取动作则无数据落地。唯有用户发起领取请求的刹那系统方才创建对应券记录数据与用户行为强绑定。1.2 发放触发型记录 适用场景商家后台批量发券、定向用户推送券、会员权益自动发券逻辑要义商家执行发券动作数据即刻生成。无需用户进行任何操作发券指令下达完成记录表同步落地属于平台主动推送模式。流程示意图Mermaid用户手动领取商家批量发放券业务发起模式判断触发领券动作新建券领取记录执行批量发券逻辑批量生成券发放记录图表说明上图清晰区分两种券记录生成链路。左侧分支为用户主动领券流程以用户操作为驱动创建记录右侧分支为平台主动发券流程由后台运营操作直接批量生成数据二者构成优惠券数据存储的两大基础模式。二、券名与券批次️ 内外分野泾渭分明券名与券批次是券体系中两大基础标识一面向用户一服务内部用途、受众、设计目标截然不同亦是日常开发中极易混淆的知识点。2.1 对外券名面向前端展示、终端用户可见是优惠券对外的 “名片”。例如劳斯莱斯5元代金券作用为视觉展示、用户识别、活动宣发侧重体验与传播。2.2 内部批次名仅用于研发、运维、运营内部协作终端用户完全无感知。同一类优惠券可在双十一、618、年货节等多轮大促重复上线仅凭对外券名无法区分发放场次。而批次名便是为区分发券批次、隔离活动数据、追溯发放链路而生依托批次标识运维可快速定位每一轮发券任务、统计核销数据、排查线上问题。对比表格标识类型面向对象核心作用用户可见性应用场景对外券名终端用户展示、识别、营销宣传✅ 可见前端页面、个人卡包、订单结算页券批次名内部人员区分批次、数据隔离、问题排查❌ 不可见后台发券、数据统计、日志追溯表格说明本表从使用对象、核心价值、可见范围、落地场景四个维度对比券名与券批次的差异帮助开发者快速厘清二者设计初衷与使用边界。三、热点 Key 问题 流量倾斜之困分流破局之法在分库分表的分布式架构下大促领券活动极易催生热点 Key热点数据问题这是分布式存储的经典顽疾轻则服务响应迟缓重则单库宕机、链路雪崩。3.1 问题成因系统为承载海量数据会将数据拆分至多个数据库节点如 DB1、DB2、DB3常态下数据均匀分布、流量均衡。当爆款优惠券活动上线整批券数据统一存储在单个数据库节点中海量领券请求会全部涌向该节点形成流量单点倾斜。单一数据库承载远超设计阈值的请求压力CPU、连接数、IO 持续打满最终引发服务不可用。3.2 主流解决方案热点数据分片打散核心思路预判热点拆分总量多库分流。假设某券批次总发放量为 100000 张预判为热点数据后将总量拆分为 10 个子分片把分片数据均匀分发至 10 个数据库节点。原本集中于单库的流量被平摊至多个节点从根源消解单点压力。热点 Key 分流原理图Mermaid普通数据热点Key数据海量领券请求热点数据预判路由至原单库DB拆分券总量为多分片分片1 → DB1分片2 → DB2分片3 → DB3分片N → DBN图表说明该图展示热点 Key 分流完整逻辑。系统首先对券数据做热点预判普通数据维持原有路由规则判定为热点数据后对券数量进行分片拆分将不同分片路由至不同数据库实现流量打散、负载均衡。四、缓存预热️ 读多写少场景前置优化降库压高并发互联网业务普遍具备读多写少的特征数据库磁盘 IO 性能有限无法直面每秒十万、百万级的查询请求缓存便成为数据库的第一道屏障而缓存预热则是活动前置优化的核心手段。4.1 核心概念缓存预热在活动正式开启前主动将静态不变、高频查询的数据批量加载至内存缓存Redis中。用户请求优先读取缓存数据绕过数据库大幅降低数据库查询压力。4.2 典型业务场景电商秒杀 / 大促领券商品详情、活动规则、券基础信息等内容在活动周期内基本不会变动。若每一次用户访问都直连数据库查询海量请求会持续冲击库表资源损耗严重。借助缓存预热可提前完成数据加载。4.3 缓存预热伪代码Java 风格/** * 缓存预热工具类 - 活动前批量加载静态数据至Redis * 适用券基础信息、秒杀商品信息、活动文案等静态数据 */publicclassCachePreheatUtil{// 注入Redis操作客户端privateRedisTemplateString,ObjectredisTemplate;// 注入数据库DAOprivateCouponInfoDaocouponInfoDao;/** * 优惠券基础信息缓存预热 * param batchId 券批次ID */publicvoidpreheatCouponCache(LongbatchId){// 1. 从数据库批量查询该批次所有券静态信息ListCouponInfocouponListcouponInfoDao.listByBatchId(batchId);// 2. 遍历数据批量写入Redisfor(CouponInfoinfo:couponList){StringcacheKeycoupon:info:info.getCouponId();// 设置缓存有效期与活动周期一致redisTemplate.opsForValue().set(cacheKey,info,7,TimeUnit.DAYS);}log.info(券批次{} 缓存预热完成共加载{}条数据,batchId,couponList.size());}}代码说明以上为缓存预热简易实现代码。程序主动从数据库批量查询券信息拼接统一缓存 Key 后写入 Redis在活动开始前完成数据预加载。活动期间用户查询直接读取 Redis无需访问数据库。4.4 写缓存优化Redis Lua 脚本缓存不仅承担读请求也需处理数据更新、数量扣减等写操作。Redis 单条命令可保证原子性但多条命令组合会存在并发安全问题。Redis Lua 脚本可将多条指令封装为一个原子脚本执行完美实现券数量扣减、状态修改等复杂操作规避并发竞争问题。五、消息队列与幂等设计 杜绝消息重复防止优惠券超发高并发发券场景中普遍采用消息队列实现异步解耦、流量削峰。但消息队列的底层特性决定了仅能保证消息至少投递一次无法严格保证只投递一次。消息重复消费会直接导致同一用户重复领券、券数量超发而幂等设计是解决该问题的核心方案。5.1 幂等核心定义幂等同一个请求无论重复执行多少次最终业务结果完全一致。落地到发券业务同一条发券消息即便被队列重复消费十次、百次用户也仅能收到一张优惠券不会出现重复发放。5.2 幂等 ID 整体架构消息体三大核心字段全局唯一幂等 IDMID幂等判断的唯一依据用户 IDUserID接收优惠券的目标用户券批次 IDBatchID待发放优惠券批次系统独立创建幂等处理记录表专门存储已完成消费的幂等 ID。5.3 幂等执行流程Mermaid已存在不存在消息队列推送发券消息解析消息幂等ID用户ID券批次ID查询幂等记录表判断ID是否已处理判定为重复消息直接丢弃执行正常发券逻辑将当前幂等ID写入记录表流程结束图表说明上图为消息幂等处理全流程。消息消费前优先查询幂等记录表若 ID 已存在说明消息已处理直接拦截若 ID 不存在则执行发券逻辑并记录幂等 ID保证后续重复消息不再生效。5.4 幂等 ID 生成方案幂等 ID 硬性要求全局唯一行业主流两种实现方案雪花算法SnowFlake开源分布式 ID 生成算法基于时间戳、机器码、序列号组合生成全局唯一 ID适配分布式集群高并发场景性能优异是互联网公司首选方案。数据库自增 ID单独创建一张自增 ID 表利用数据库主键自增特性生成唯一编号。实现简单、上手门槛低适合中小体量业务、单体应用。5.5 幂等判断核心伪代码/** * 发券消息消费 幂等判断逻辑 */publicclassCouponMessageConsumer{privateRedisTemplateString,ObjectredisTemplate;privateCouponServicecouponService;// 消息消费入口publicvoidconsumeCouponMsg(CouponMessagemessage){Stringmidmessage.getMid();// 幂等IDLonguserIdmessage.getUserId();// 用户IDLongbatchIdmessage.getBatchId();// 券批次ID// 1. 幂等判断查询Redis判断该ID是否已处理StringidempotentKeyidempotent:mid:mid;BooleanisExistsredisTemplate.hasKey(idempotentKey);if(Boolean.TRUE.equals(isExists)){// 重复消息直接返回不执行业务log.warn(幂等ID{} 已处理忽略重复消息,mid);return;}// 2. 执行发券业务couponService.sendCoupon(userId,batchId);// 3. 标记该幂等ID已处理设置过期时间与业务周期一致redisTemplate.opsForValue().set(idempotentKey,1,15,TimeUnit.DAYS);}}代码说明该代码模拟消息消费与幂等拦截逻辑。以 Redis 存储已处理幂等 ID利用hasKey做快速判重拦截重复请求从代码层面实现发券接口幂等性。六、消息队列与缓存预热⚖️ 功能分野各司其职二者同为高并发架构两大基石但定位、职责、应用场景天差地别切不可混淆消息队列承接全量业务请求实现异步处理、流量削峰、服务解耦。核心作用是处理业务请求、削平流量波峰直面写请求与复杂业务逻辑。️缓存预热仅负责静态数据预加载服务于页面查询、数据展示不参与业务请求处理。核心作用是加速读请求、降低数据库压力。一者处置动态请求一者优化静态查询相辅相成共建高并发架构。七、Redis 分布式锁 RedLock️ 突破单机性能瓶颈领券、扣库存等并发争抢场景常使用 Redis 分布式锁保证数据安全。单机 Redis 锁存在天然短板所有争抢请求集中于单节点极易形成请求排队拉高响应耗时出现性能瓶颈。7.1 优化方案RedLock红锁RedLock 摒弃单节点加锁模式在多台独立 Redis 节点上同时对同一个 Key 加锁。只有多数节点加锁成功才判定为锁获取成功。优势突破单机硬件与连接数限制横向扩展集群承载能力大幅提升锁服务并发上限适配超大流量领券场景。7.2 技术方案选型原则业界存在多种解决方案如 MySQL 8.0 插件化改造、定制化中间件等。在生产环境选型时需遵循以下原则优先选用通用、成熟、经过大规模线上验证的技术方案小众定制化方案、非通用插件虽可临时解决问题但生态薄弱、排查困难、兼容性差线上风险较高综合考量稳定性、运维成本、学习成本择优落地。八、防重复领券️ Redis 集合去重筑牢业务防线限制用户重复领券、超额领券是优惠券系统必备的基础能力。依托Redis Set 集合的天然去重特性可高效实现该需求。8.1 实现原理Redis Set 集合特性元素唯一重复元素无法写入。我们将「券批次 ID 用户 ID」作为集合元素记录已领券用户。用户发起领券请求时先校验集合中是否存在当前用户标识以此判断是否允许领券。8.2 执行流程用户发起领券请求查询 Redis Set判断用户 ID 是否已存在已存在 → 拦截请求提示 “已领取不可重复领取”不存在 → 执行发券逻辑同时将用户 ID 写入 Set 集合8.3 防重领券伪代码/** * Redis Set 实现防重复领券 */publicclassCouponReceiveController{privateRedisTemplateString,ObjectredisTemplate;privateCouponServicecouponService;publicStringreceiveCoupon(LonguserId,LongbatchId){// 拼接集合Key一个券批次对应一个Set集合StringsetKeycoupon:receive:batch:batchId;// 1. 判断用户是否已领券LongcountredisTemplate.opsForSet().size(setKey);BooleanmemberExistredisTemplate.opsForSet().isMember(setKey,userId);if(Boolean.TRUE.equals(memberExist)){return您已领取该优惠券请勿重复操作;}// 2. 执行领券逻辑booleanresultcouponService.receive(userId,batchId);if(result){// 3. 领取成功将用户ID加入Set集合redisTemplate.opsForSet().add(setKey,userId);return领券成功;}return领券失败券已抢完;}}代码说明利用 Redis Set 实现用户领券去重借助isMember判断用户领取状态领取成功后调用add写入用户 ID天然规避重复领取问题读写性能可支撑大促高并发流量。九、总结与感悟 小业务藏大架构一枚小小的优惠券看似是简单的营销功能实则串联起分库分表、热点流量治理、缓存架构、消息队列、幂等性、分布式锁、并发防重等全套分布式高并发技术体系。从数据记录的细微规则到海量流量的全局治理从单接口并发防护到全链路架构优化每一处设计都围绕性能、安全、稳定三大核心展开。深耕业务场景拆解技术难点方能在高并发架构之路上稳步前行。希望本文的流程拆解、代码示例、图文分析能为各位开发者带来参考与启发✨。

相关新闻

基于AI Agent与桌面自动化的微信自动化操作实践

基于AI Agent与桌面自动化的微信自动化操作实践

1. 项目概述:当AI助手开始“动手”最近,一个名为“小龙虾”的项目在技术圈里小火了一把。它的核心卖点非常直接:让Claude这类大型语言模型(LLM)能够直接操作你的电脑微信。这听起来有点科幻,但背后其实是一…

2026/8/7 3:01:46 阅读更多 →
电路分析核心方法:节点电压法原理、步骤与实战案例详解

电路分析核心方法:节点电压法原理、步骤与实战案例详解

1. 项目概述:为什么“节点电压法”是电路分析的利器?如果你正在学习电路原理,或者工作中需要分析复杂的电子线路,那么“节点电压法”绝对是你绕不开、也必须熟练掌握的核心工具。我第一次接触这个方法是在大学电路课上&#xff0c…

2026/8/7 3:01:46 阅读更多 →
材料热学性质计算:基于Phonopy的模式格林艾森常数完整指南

材料热学性质计算:基于Phonopy的模式格林艾森常数完整指南

1. 项目概述:从声子谱到材料“热脾气”的量化 做材料计算的朋友,对声子谱(Phonon Dispersion)和声子态密度(Phonon DOS)肯定不陌生。这是我们评估材料动力学稳定性、热力学性质的基石。但很多时候&#xff…

2026/8/7 3:01:46 阅读更多 →

最新新闻

PY32F003F18按键输入实战:从GPIO配置到状态机消抖

PY32F003F18按键输入实战:从GPIO配置到状态机消抖

1. 项目概述:从“点灯”到“按键”,嵌入式开发的必经之路玩过PY32F003F18的朋友,或者说接触过任何一款MCU的朋友,第一步大概率都是“点灯”。当LED在你的控制下亮起、熄灭、闪烁时,那种“掌控硬件”的成就感是无与伦比…

2026/8/7 3:49:12 阅读更多 →
C++程序员简历优化指南:从关键词到项目描述的实战技巧

C++程序员简历优化指南:从关键词到项目描述的实战技巧

1. 一份C简历的核心价值:为什么你的简历总被筛掉?我见过太多C程序员的简历,也参与过不少招聘筛选。很多时候,不是候选人技术不行,而是简历在第一关就被HR或初筛系统无情地刷掉了。一份合格的C简历,其核心价…

2026/8/7 3:49:12 阅读更多 →
OpenClaw技能系统配置实战:从架构原理到飞书集成与自定义开发

OpenClaw技能系统配置实战:从架构原理到飞书集成与自定义开发

1. 项目概述:为什么你需要关注OpenClaw的技能系统?如果你正在寻找一个能够深度集成多种AI模型、并能通过自定义技能(Skills)来扩展其能力的智能体框架,那么OpenClaw很可能已经进入了你的视野。它不是一个简单的聊天机器…

2026/8/7 3:49:12 阅读更多 →
生产级企业知识库 RAG 检索策略全梳理

生产级企业知识库 RAG 检索策略全梳理

检索工程 “ 前置过滤 → 多路召回 → 结果融合 → Rerank 重排 → 阈值截断 → 上下文组装 → 拒答机制。 很多人一聊企业知识库 RAG,第一反应就是:把文档切块、做 Embedding、存进向量库,然后按相似度检索。 这个思路做 Demo 没问题&…

2026/8/7 3:49:12 阅读更多 →
基于STM32与DHT11的温湿度监控系统:从硬件设计到Proteus仿真全流程解析

基于STM32与DHT11的温湿度监控系统:从硬件设计到Proteus仿真全流程解析

1. 项目概述:从零构建一个温湿度监控“大脑” 最近在整理工作室的环境数据记录,发现市面上的温湿度计要么功能单一,要么数据无法导出,对于想长期监测并分析环境变化的人来说不太友好。于是,我决定自己动手,…

2026/8/7 3:49:11 阅读更多 →
Flutter+Rust构建跨平台SSH管理工具:Polarmote架构解析与实战

Flutter+Rust构建跨平台SSH管理工具:Polarmote架构解析与实战

在服务器管理和日常运维中,SSH(Secure Shell)连接是开发者绕不开的日常工作。无论是管理单台云服务器,还是维护数十上百台集群,高效、安全地管理SSH连接信息都是一个痛点。传统的命令行工具虽然强大,但缺乏…

2026/8/7 3:48:11 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →