号码生成系统的创新实践:游戏周周乐幸运码设计
作者: vivo 互联网服务器团队- Zhang Jing
本文以游戏周周乐的幸运码为切入点,针对其生成过程中涉及的随机性、唯一性及高并发等特点,设计了一种基于号段+子码的创新架构。该方案不仅在生成速度上表现突出,还显著提升了存储效率,同时降低了扩容成本,为类似的号码生成系统提供了设计上的新思路和启发。
文章太长?1分钟看图抓住核心观点👇
一、业务背景
用户可通过完成相关任务获取周周乐幸运码,幸运码的投放规则如下:
-
基础投放量:每期100万注唯一无重复的6位数字幸运码
-
动态扩容机制:参与人数超额时,可实时追加100万注
二、幸运码特性
根据背景介绍,我们可以知道幸运码需要支持如下特性:
-
随机性,发给每个用户的幸运码都是随机的,同时每个用户领取的多个幸运码也是随机的。
-
唯一性,每一组的幸运码中,各幸运码都是唯一的。
-
范围性,幸运码严格限定在000000到999999区间内。
-
高并发,幸运码的生成和发放需要支持高并发,能够至少达到300QPS。
-
可追加,在当期活动非常火爆时,需要可临时追加一组幸运码库存。
三、方案选型
鉴于幸运码需严格限定在6位数字范围内(000000-999999),传统雪花算法因生成超长ID(64位二进制)且依赖时间戳递增特性,难以直接适配。以下将对比三种方案:实时随机生成模式、预生成库存模式及号段+子码模式,并会根据生成速度、存储效率、扩容成本三个核心指标进行系统性评估,最终选择出最优解决方案。
3.1 方案一:实时随机生成模式
实现逻辑:
-
生成随机数
-
再查询数据库是否有该随机数
-
若没有则入库,完成幸运码发放
-
若有再重新执行第一步
缺陷分析:
-
碰撞概率随库存消耗不断上升
-
数据库IO压力随并发量线性增长
-
不满足高并发场景性能要求
3.2 方案二:预生成库存模式
实现逻辑:
采用预生成幸运码方式:离线生成100万个幸运码,随机打散,写入数据库,每个幸运码对应一个从1自增的序列号,并使用Redis记录幸运码序列号索引,初始值为1。
发放步骤如下:
-
从Redis查询幸运码序列号索引
-
使用该索引查询幸运码,并完成幸运码发放
-
递增Redis的序列号索引,确保序列号索引关联的幸运码是下一个可发放的幸运码
缺陷分析:
-
存储空间浪费:未发放号码占用存储
-
扩容效率低下:追加库存需重新预生成
3.3 方案三:号段+子码模式
采用号段+子码机制:
-
号段管理:将10^6号码划分为1000个号段(号段值:0-999)
-
子码管理:每个号段维护1000个可用子码(子码值:0-999)
-
生成规则:幸运码=随机号段*1000+随机子码(示例:129358=129*1000+358)
3.4 方案对比
综上,我们综合幸运码生成速度、存储效率、扩容成本等指标,最终采用了号段+子码模式来生成幸运码。
四、关键技术实现
4.1 号段分层机制
将100万注幸运码划分为1000个号段(每段1000注),每个号段由两部分组成:
-
号段ID:号段ID为唯一且不重复的整数,范围介于0到999之间。
-
子码串:1000位字符串,采用"01"标记使用状态,0表示未使用,1表示已使用,初始全0。
幸运码生成公式:
幸运码 = 号段ID * 1000 + 子码位置
该设计既保留了生成幸运码的随机性(号段ID随机+子码随机),又通过子码的类比特位存储方式提升了存储效率。
4.2 分布式并发控制
4.2.1 多级缓存策略
Redis存储可用号段集合,若号段的子码使用完,该号段会从Redis集合中剔除,同时本地缓存也会预加载可用号段,确保发码时能更高效地获取候选号段。
4.2.2 高效锁抢占策略
系统为每个号段分配了分布式锁,当执行发放幸运码时,会从本地缓存随机获取15个候选号段。然后在遍历获取号段时,将等待锁的超时时间设置成30ms,确保号段被占用的情况下能够快速遍历到下一个号段(根据实际场景统计,等待锁的情况很少发生,一般最多遍历到第二个号段即可成功抢占)。一旦成功获得号段的分布式锁后,便可进一步随机获取该号段下的可用子码。
4.2.3 动态库存策略
要追加库存,只需再创建一组幸运码号段,并写入Redis,后续发放时获取该组的可用号段生成幸运码即可。从性能和存储空间上远优于预生成方式。
4.3 幸运码发放
发放步骤:
-
随机获取至多15个可用号段
-
遍历号段
-
抢占号段的分布式锁
-
若号段的分布式锁抢占成功,则随机获取号段中可用的子码,再根据号段和子码生成幸运码
-
若号段的分布式锁抢占失败,则遍历下一个号段,并重复上述步骤
五、总结
(1)双重随机保障
-
一级随机:号段选择随机(0-999)
-
二级随机:子码选择随机(0-999)
-
通过号段随机和子码随机方式确保生成的幸运码完全随机
(2)数据唯一性
- 通过号段唯一和号段内的子码唯一确保生成的幸运码全局唯一
(3)弹性扩展能力
-
扩容耗时仅需秒级别
-
存储空间相比预生成方案节省80%
(4)高性能发放
-
通过多重缓存及高效号段抢占策略大幅提升幸运码生成效率
-
实测QPS>300,平均响应时间<15ms
本设计方案通过创新的号段+子码管理机制,在保证号码随机性和唯一性的同时,实现了高并发场景下的稳定服务能力,为类似号码生成系统的设计提供了可复用的架构范式。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
产学研新范式|拓数派创始人兼CEO冯雷携拓数派「智能体工场」亮相上大MBA训练营
下文转载自:上海大学MBA公众号SHUMBA 2025年6月28日,上海大学MBA中心“AI领导力提升训练营”首期课程顺利开展,本次训练营共计三天,分为AI发展态势、AI垂直应用、AI战略应用三个模块。首日课程在上海大学延长校区引力楼拉开帷幕。 图:AI领导力训练营上课现场 上海大学管理教育研究院副院长王家宝老师进行了开营致辞。他提到:上海大学MBA中心自成立以来,紧跟时代步伐,形成了独具特色的教育体系和培养模式。在未来五年,中心将以“打造数智时代引领产业变革的卓越MBA人才培养中心”为愿景,坚持“DIG”发展战略:Digitalization(数字化)、Industry driven(产业驱动)和Globalization(国际化),不断为社会与商界培养高层次管理人才。当前,人工智能技术的飞速发展正深刻改变着商业模式、组织形态和管理方式。面对这一变革,MBA中心基于对时代趋势的敏锐洞察和对人才培养需求的精准把握,推出了AI领导力提升训练营。他提到本次训练营的三个亮点:1.剖析AI技术的底层逻辑、发展趋势以及在不同行业的应用场景,打破技术认知壁垒,从而理解AI如何重塑商业生态;2.引...
- 下一篇
搜索数据建设系列之数据架构重构
导读 主要概述百度搜索业务数据建设的创新实践,重点围绕宽表模型设计、计算引擎优化和新一代业务服务交付模式(图灵3.0开发模式)三大方向,解决了传统数仓在搜索场景下面临的诸多挑战,实现了搜索数据建设的高效、稳定、低成本;为百度搜索业务敏捷迭代奠定夯实基础。 名词解释 TDS(Turing Data Studio): 是基于图灵(百度内部数据分析平台)的数据建设解决方案,提供 数据开发、数仓管理、监控运维、资源管理等一站式服务的数据开发平台。详情参见:百度MEG数据开发治理平台-TDS TDA(Turing Data Analysis):是一款可视化BI产品,旨在帮助用户轻松上手及使用,进行拖拽式可视化数据分析及仪表盘建设。产品模块包括仪表盘、数据集、可视化分析及智能分析模块。详情参见:百度一站式数据自助分析平台(TDA)建设 TDE(Turing Data Engine ):是基于图灵生态的计算引擎,包含Spark计算引擎和ClickHouse。详情参见:揭秘百度数仓融合计算引擎ClickHouse在百度MEG数据中台的落地和优化 UPI(Udw-API):百度内部编程访问接口;以Map...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境