中图分类号:TP311 文献标识码:A 文章编号:2096-4706(2025)08-0100-06
Abstract: WiththedevelopmentofInternet technologyandtheupgrading ofuser needs,seckillsystemandraffeactivities have becomeanimportant means forthe platformto atract new usersand increase the numberofusers.Among them,raffle activitiesareoreenttoetoatefseffctstoughcialsotwareaingHoweer,igoncurecyprocigha become a keychallenge tothe succssof these activities,testing thesystem stabilityanduser experience.Therefore,this paper designsahigh-concurrencyAPPseckilloterysystembasedonRediscluster.Throughloadbalancing,three-end(resourceend,clientddsepaoigaiptrololgyodistrol algorithmandother technical means,itensures thestableoperationof thesystem,improves theuser experience,and provides a solid technical foundation for the smooth development of platform activities.
Keywords:Redis; high-concurrency; seckill system; system design
0 引言
随着互联网技术的爆发和用户需求的升级,秒杀与抽奖活动成为平台用户量增长的催化剂,尤其是抽奖活动借助社交软件的分享实现病毒式扩散,高效吸引新用户并引爆裂变效应,与传统广告方式相比,自发分享更能激发用户兴趣。但高并发处理成为技术拦路虎,考验着系统的稳定性与用户体验,瞬时高并发流量的处理决定了活动的成败。
面对这一核心挑战,设计了一款基于Redis集群的高并发APP秒杀抽奖系统,以F5和Nginx构建系统入口的负载均衡和高可用性,配合资源端、客户端、服务端三端分离设计,确保系统流量的平衡负载;结合Redis单线程与高并发的优势,通过Lua脚本控制技术保障命令的原子性,实现活动的高可靠性;异步发奖机制有效缓解秒杀抽奖期间的压力,数据分级存储策略和业务流量控制算法,使得系统运行高效且稳定,为活动成功提供坚实的技术护航。
本文聚焦于系统在高并发下的稳定运行,旨在通过技术创新,优化用户体验,为平台活动的顺利开展奠定技术基础。
1高并发解决方案
鉴于公司业务特性和中国移动庞大的用户规模,本文聚焦秒杀抽奖活动中的高并发、大流量挑战,优化系统设计,构建高性能秒杀抽奖系统。关键技术点包括:
1)Redis缓存策略。Redis作为高性能键值存储系统,其单节点读写速度分别可达110000次/秒和81000次/秒[],所有操作具备原子性,确保了数据一致性。
2)F5硬件负载。F5设备用于网络流量转发与监控,通过检测后端状态按策略(轮询、最少连接、IP哈希)均衡分发请求,提升系统稳定性和响应速度。
3)Nginx软负载。Nginx是一款高性能的HTTP和反向代理Web服务器,能经受住高负载的考验,通过轮询算法将客户端请求转发到不同的后端服务器上[2],实现流量的负载均衡,提高服务的并发能力。
4)Kafka分布式流处理。Kafka是一个基于Zookeeper的分布式消息系统,它具有高吞吐、低延迟、可靠性好、容错能力强的良好特性[3]。在高流量场景下通过Kafka缓存请求,确保下游服务按需处理,维持系统稳定。
2 需求分析
秒杀抽奖系统主要包含两部分功能需求,分别是用户端的功能需求和运营管理端的功能需求。用户端的主要功能包括奖品查看、奖品使用、奖品列表、活动规则、活动分享等,使用户可以了解活动的规则和参与方式,界面设计要求简单、实用,方便用户进行抽奖和活动分享。运营管理端主要供后端普通用户和管理员使用,普通用户可以创建、修改抽奖活动,活动创建好后提交管理员审核。管理员主要负责活动的审核,审核通过后抽奖活动即可正常进行。
3 系统设计
活动总体架构是基于面向服务(Service-OrientedArchitecture,SOA)的架构设计[4],前后端分离部署,逻辑解耦,同时满足B/S架构,跨平台灵活展示,服务可扩展性强。系统技术架构如图1所示。
前端通过浏览器进行业务展示和配置,通过HTTP请求后端服务接口数据,使用Vue框架进行页面逻辑编排和UI渲染。后端采用Java语言编写,基于业务需求进行模型归类,分成不同的服务模块,可同时提供给前端、模块间及其他业务使用,模块服务间依靠HTTP或RPC框架进行通信。
数据存储和记录采用三级模式,将数据分为热数据、活跃数据和持久化数据[5],分别采用不同数据库进行支撑。Redis高性能数据库集群用于承载用户热数据,作为缓存数据库使用,支撑用户高并发、高频写入、高响应的使用场景,满足用户的体验需求。Elasticsearch(ES)实时引擎数据库,用来存储用户奖品记录、参与记录等活跃数据,满足大数据量[、高写入的场景。MySQL集群数据库用来存储核心配置数据、用户奖品订单等需要长期保存的数据,保证数据的准确、安全、可靠。
4功能设计
系统主要分为两个部分:前端抽奖秒杀功能和后端管理功能。前端主要用于介绍抽奖活动、抽奖规则、秒杀抽奖、奖品使用等,帮助用户了解具体的活动内容以及进行秒杀抽奖活动,前端功能如图2所示。后端管理功能用于进行抽奖活动的配置、抽奖活动发布审核、中奖名单的查看等,配合前端功能形成一个完整的秒杀抽奖系统,后端功能如图3所示。
抽奖秒杀系统用户登 查看中奖奖品模块 活动分享模块 抽奖秒杀模块 奖品使用模块 引流功能模 评价管 系统管理录 理
抽奖秒杀系统中奖明细查看模块 抽奖活动列表模块 抽奖活动创建模块 奖品配置模块 抽奖活动审核模块 访问统计模块
4.1 前端秒杀抽奖功能设计
前端秒杀抽奖功能具体设计如下:
1)用户登录模块。默认的登录机制是通过采用中国移动的移动认证服务,该服务能在移动网络环境中自动鉴别用户身份[7,一键登录方式提升了用户体验并增加了系统的安全性。
2)查看中奖奖品模块。用户可以查看秒杀活动中奖奖品,包括中奖活动、中奖时间、中奖的物品、奖品兑换使用日期、奖品是否已经使用或者兑换。如果用户没有中奖记录,则提示用户暂时没有中奖信息;奖品快到期未兑换时,提示用户及时进行兑换。
3)抽奖秒杀模块。用于显示秒杀抽奖活动信息,包括秒杀的开始时间、结束时间、秒杀抽奖倒计时、活动的状态信息(待开始、秒杀中、已结束),同时提供活动倒计时刷新校准功能。在抽奖过程中增加用户正在排队的提示,中奖后提示用户已秒杀成功,奖品正在发放,请稍后;对未中奖用户推荐参与其他活动,增加页面的引流用户量。
4)奖品使用模块。用来进行奖品的兑换和使用,同时可以查看历史奖品使用记录,包括中奖活动信息、中奖信息、奖品是否使用、兑换时间等。
5)活动分享模块。当用户触发分享动作时,后端接收到分享请求,根据活动ID、用户ID信息生成一个唯一的分享码(使用UUID + 时间戳)。将分享码拼接到基础分享URL之后,形成完整的分享链接。通过分享的链接,接收方可以解析URL直接访问或了解活动详情。
6)引流功能模块。通过引流模块可以加挂自己平台的相关链接,增加系统或品牌的知名度,提升平台的访问量。
4.2 后端功能设计
系统后端功能具体设计如下:
1)中奖明细查看模块。管理员可以查看中奖用户的明细信息[8],包括中奖的活动名称、中奖时间、中奖用户的信息、奖品信息、奖品的使用时间、奖品的有效期等基本信息,可以根据关键字进行搜索以及对中奖信息进行导出。
2)抽奖活动列表模块。用于管理员查看系统的现在的秒杀抽奖活动,包括抽奖活动的状态(进行中、已结束)、活动的运行情况等信息。
3)抽奖活动创建模块。管理员可以创建抽奖活动,主要包括活动的基本信息、参与条件、结果展示三个功能。活动的基本信息包括活动名称、活动的开始和结束时间、参与方式(报名参与、邀请参与等方式);参与条件用于规定参与抽奖秒杀活动的用户的基本条件,例如用户活动的积分、活跃度等条件。结果展示用来控制抽奖首页是否实时展示中奖信息。
4)奖品配置模块。管理员可以选择一个活动对奖品信息进行配置,包括奖品种类、数量、价值以及中奖概率等,同时也可以对奖品信息进行修改操作。
5)抽奖活动审核模块。普通管理员通过平台创建抽奖活动,创建完成后提交给系统超级管理员进行审核,超级管理员可以对活动进行修改,活动审核通过后才能正常开展。
6)访问统计模块。用于进行活动的统计,主要包括页面的访问总量、独立访客数量、日访问量、通过活动新注册的用户量。
4.3 关键技术
4.3.1 Edis集群模式
为保证Redis的性能和高可用,采用5主5从的
Redis集群模式。在集群模式中,主节点用于提供读写服务,从节点用于做冗余,有效防止单个节点异常造成系统不可用现象,同时数据分片到不同的节点上,提高数据的存储量。
4.3.2 异步发奖模式
利用Redis单线程特性作为库存管理器,通过Lua脚本保证多个命令的原子性,从而控制秒杀资格(即库存)。资格秒杀成功后,修改Redis库存,并将中奖用户的手机号放入发奖消息队列,由单独的异步发奖服务进行发奖。发奖时可以控制并发线程,从而控制发奖速率,避免对发奖系统造成压力。异步发奖架构如图4所示。
4.3.3 三端分离设计
在大流量高并发的秒杀场景下,要尽可能分流流量,减轻服务器及网关的流量压力。秒杀场景的流量主要分为核心逻辑接口流量、动态数据流量、静态资源流量等,通过采用资源端、客户端、服务端三端分离技术实现业务流量的平衡负载。
首先,将静态资源上云,利用中国移动内容分发网络(ContentDeliveryNetwork,CDN)技术将静态资源放在云端的CDN节点上,减轻了核心业务网关和业务服务器的压力,实现了第一层的静态流量剥离。其次,在首屏加载时,将动态数据缓存在客户端浏览器内,数据的生命周期为5分钟。在生命周期内读取客户端本地缓存数据,数据过期后,下次页面加载会请求最新的数据内容。服务器动态数据的更新频率也是5分钟,与客户端数据生命周期保持一致,减少了数据接口的请求频率,实现了第二层的动态数据流量剥离。最后,服务端承载着核心的业务逻辑,包括定时秒杀、抽奖等逻辑,此时到达网关和服务器的流量已经大大减少。
4.3.4脚本语言插入控制技术
使用Lua脚本实现数据一致性。Java自带的组件需要先执行GET操作,再根据结果执行SET操作,这可能会出现条件竞争漏洞的情况,例如在执行GET后但执行SET之前,有其他客户端修改了数据。Redis中的Lua脚本具有原子性[]:当一个Lua脚本执行时,整个脚本作为一个单一的操作执行,不会被其他命令中断[0]。这样可以使得脚本中的多个Redis操作被打包成一个原子操作,从而避免并发问题,确保操作的一致性。
使用Lua脚本提升操作效率。在秒杀场景中,由于并发量巨大,瞬间会有大量的请求涌入,网络延迟也会影响用户是否能够抢到奖品。使用Java自带组件操作Redis时,如果需要执行多个Redis操作,则需要多次调用,而使用Lua脚本可以将多个操作封装到一个脚本中,减少操作次数,节省网络延迟损耗。
使用Lua脚本解决复杂逻辑问题。在操作Redis时,可能会遇到一个事件动作需要多次操作Redis的逻辑。通过在Java代码中嵌入Lua脚本,可以在Redis层面实现复杂的计数、过期、加锁等操作,而无须将数据拉回Java进行处理后再写入Redis,从而减少数据回传给Java应用的必要性,能够直接在缓存层完成一些较复杂的任务。
4.3.5业务流量控制算法
中国移动拥有上亿用户,使得抽奖秒杀活动流量存在较大的不确定性。对业务流量进行合理控制不仅可以保证系统的稳定运行,还可以优化用户体验,同时保证系统的安全性,防止恶意攻击。系统中采用多轮概率算法和漏桶算法组合控制流量,保护下游系统安全。
多轮概率算法是一种基于随机化思想的限流算法,通过多轮的概率性选择来决定是否允许请求通过。引入随机性使用户请求更加公平,流量控制更加平滑。多轮概率算法如图5所示。系统启动时会设置一个初始概率 二
)。请求到达时,系统随机生成一个0到1之间的数
如果该数
则该请求通过,进入秒杀业务流程;如果该数
,则将该用户进行标识后放入临时集合 S ,该集合绑定一个二轮概率
),并返回用户再次请求的提示。当用户再次请求时,检查临时集合S 中是否存在该用户。如果存在,则再次生成一个0到1的随机数
。如果该数
,则请求通过,并从集合 S 中删除该用户标识;反之,则再次返回用户再次请求的提示,以此循环。此算法可以根据当前的流量、系统负载情况,通过人为动态调整概率阈值P 的大小和轮次,以适应瞬时流量的变化,保护系统稳定。

通过漏桶算法来平滑流量并限制数据传输速率,确保流量在较长时间内保持稳定。其实现原理是把请求流量比作水流,水流入桶中,桶有固定的容量 c 超过容量的请求将被丢弃。桶底有个小孔,请求以固定速率 r 从孔中流出,如果没有请求流入,桶中的请求会逐步流出直至流空为止。在系统启动时会提前预设秒杀库存,此库存可以认为是桶的容量,秒杀逻辑就是向桶中加水的过程,加到桶中的请求即为秒杀成功,桶满后的请求均为库存耗尽,秒杀失败。系统会单独启动一个或多个线程从桶中取出对应的请求用户进行异步发奖,线程数量和间隔时间可以人工设定,从而控制发奖速率。在秒杀业务场景中,发奖系统是下游系统,无法承受大流量高并发的冲击。使用漏桶算法可以人工控制请求以恒定的速率流出,因此即使请求到达速率是突发的,系统的处理速率依然保持稳定。这种流量可控、平滑的特性,避免了系统因突发流量而超载。
4.4 系统高可用设计
4.4.1 活动入口高可用
活动入口是一个公网域名,通过这个公网域名映射到公司内部网络的两台F5设备上,通过域名轮询的方式将流量转发到后端不同的F5设备上。通过这种方式可以保证入口的高可用性,同时可以防止系统流量过大导致入口压力过大,影响系统可用性。此外,双入口F5的设计还可以有效避免单台F5故障导致的系统不可用,提高系统的稳定性。系统入口架构如图6所示。
4. 4. 2 数据库高可用
数据库高可用结构如图7所示。系统数据库采用了MySQL双主架构的设计,双主之间进行数据的实时同步。为了避免数据库出现循环复制现象,在两台主机上安装了Keepalived,系统访问数据库通过Keepalived的虚拟IP地址(VirtualIPAddress,VIP)进行访问,实现数据库的单向写入复制。


在Keepalived配置文件中加入了vrrp_script模块,用来执行数据库脚本,检测数据库的状态。一旦检测到数据库异常,触发Keepalived切换,自动实现VIP的切换漂移,从而实现数据的高可用性。同时,数据库采用分库分表的方式,对请求量较大的表一一奖品配置表和中奖记录表进行分库分表,提升数据库的访问效率。
keepalive组件vrrp_script配置
vrrp_scriptcheck_mysql{ script \"/etc/keepaiived/scripts/check mysql.sh\" interval 5 fail 15 rise1 timeout 60 weight -10
了
mysql状态检测脚本
#!bin/bash
/usr/bin/curl-basic127.0.0.1:3637
4.4.3 应用双中心部署
中国移动用户量巨大,为了保障活动的高可用,系统在公司两地机房同时部署,其中A机房作为主中心,B机房作为备中心使用。两地机房数据库数据通过公司数据同步平台进行实时同步。当其中一个机房出现故障时,可以通过修改公网域名映射地址,快速将流量切换到另一个机房,并同步切换两机房数据库的数据同步方向,保证数据库的高可用性。应用双中心部署架构如图8所示。

4.5 系统安全设计
4.5.1 防止外挂刷接口设计
活动之前,秒杀相关的核心接口均随机生成URL反馈给前端错误的URL地址,在秒杀时刻动态给前端返回正确的接口URL。同时加上需要登录操作,可以有效限制或减少外挂直接调接口秒杀对系统库存造成的影响。
4.5.2 Nginx限流设计
在核心转发Nginx上配置限流,当流量过载时返回引导安抚页,提高用户体验和系统稳定性。总体限制次数,限制总量,快速失败降级运行,熔断隔离防止雪崩。
4.5.3 系统监控与日志审计
相关组件和服务统一接入公司监控平台,全链路实时监控系统的运行状态,并对运行异常的服务进行短信告警。系统的接口访问日志和运行日志统一上传到公司日志平台中长期保存。
5 系统应用效果
该秒杀抽奖系统架构已在“中国移动APPXXX充值日抽奖秒杀推广”中使用。根据监控数据来分析,活动当日最大支撑14万/秒的并发,系统运行正常。Redis集群每秒查询次数(QueriesPerSecond,QPS)峰值约61.2万,其中单个节点最大15.5万,期间奖品秒杀服务各节点负载正常,接口数据返回正常。Redis集群QPS和节点QPS如图9、图10所示。目前,该系统已陆续推广至“中国移动XXX先锋”“移动双XXX”“新春XX节”“中国移动618”等活动中。在全网大型营销活动中,整体为中国移动APP带动拉新促活用户共513万户/月。
6结论
本文探讨了基于Redis集群的高并发APP秒杀抽奖系统的设计与实践,提出了一种综合性的解决方案。通过引入Redis缓存、软硬负载均衡、Kafka分布式流处理、三端分离设计等技术,构建了高性能、高并发的秒杀抽奖系统架构。针对秒杀抽奖系统瞬时高并发的特点,采用多轮概率算法来控制高并发流量平滑进入后端服务。秒杀过程中通过使用Lua脚本实现原子操作,秒杀成功后通过漏桶算法动态控制发奖速度,降低系统压力。在系统的安全性和高可用方面,采用双中心主备模式部署、核心接口URL随机生成、系统全链路实时监控和操作审计,提升了系统的高可用性。下一步将在该秒杀抽奖系统的基础上,深入研究Redis热点数据的自动化监控和请求动态均衡,进一步提升Redis的性能。
参考文献:
[1]张积存,宋雪萍,费继友,等.基于车辆信息的大数据分析系统设计与实现[J].计算机应用与软件,2023,40(1):11-16+37.
[2]胡科,陈勇.基于Nginx+Keepalived实现高可用集群及负载均衡配置与分析[J].微型电脑应用,2022,38(5):200-202.
[3]赵润发,娄渊胜,叶枫,等.基于Flink的工业大数据平台研究与应用[J].计算机工程与设计,2022,43(3):886-894.
[4]王逸涵.基于SOA的政府数据开放平台设计与建构[D].哈尔滨:黑龙江大学,2021.
[5]赵力帅,李耕宇,武振宇,等.基于分层异构数据库系统的历史数据归档技术[J].电信科学,2018,34(S1):174-178.
[6]丁煜.“蓝莓云超市”融媒电商小程序平台设计与实现[J].广播电视信息,2021,28(8):33-35.
[7]廖卓,姚敏,余筱,等.基于Keepalived和Mycat的MySQL数据库高可用性设计与实现[J].现代信息科技,2022,6(11):27-29+33.
[8]闫保正.基于微服务架构之电商秒杀系统的设计与实现[D].上海:华东师范大学,2021.
[9]李林飞.基于内存数据库的持久化方案的设计与实现[D].成都:电子科技大学,2020.
[10]李诗云.基于内存数据库Redis的众包系统性能优化[D].杭州:浙江大学,2016.
作者简介:贾业武(1985—),男,汉族,河南信阳人,高级工程师,本科,研究方向:运维管理体系建设、数字化标准化运维体系建设;通信作者:汤泽宇(1990一),男,汉族,河南孟州人,工程师,硕士研究生,研究方向:系统可用性架构设计;张国顺(1992—),男,汉族,河南安阳人,工程师,硕士研究生,研究方向:智能化运维;王旭峰(1980一),男,汉族,河南嵩县人,工程师,硕士研究生,研究方向:计算机软件与理论;马世毓(1988一),男,汉族,河南焦作人,工程师,本科,研究方向:计算机软件开发;李政锡(1995一),男,汉族,河南焦作人,工程师,本科,研究方向:智能化运维。