千万级用户ms级抽奖N名设计方案

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 大促节零点时,从关注的用户中抽出N个人进行礼品发放,预计全网超过千万用户参加关注抽奖活动,要求:同一用户不能重复参与同一用户不允许二次中奖

🎈1 需求

大促节零点时,从关注的用户中抽出N个人进行礼品发放,预计全网超过千万用户参加关注抽奖活动,要求:


同一用户不能重复参与

同一用户不允许二次中奖

🎈2 设计方案


🍮 2.1 最原始

rand(),对每行随机产生一个随机数


select * from 关注用户表 order by rand() desc limit,0,100


预计千万级别的对技术倒排大概率凉凉。


🍮 2.2 N次随机选择SQL

效率可以,不过要先后执行两条SQL,并发时有原子性问题,且RAND函数不能保证不重复中奖。


offset = SELECT FLOOR(RAND() * COUNT(*)) AS offset from 关注用户表

select * from 关注用户表 limit offset,1

🍮 2.3 Redis Set随机弹出


📐step1:

在用户关注直播间在写入MySQL关注用户表时,再往Redis增加一个userlist Set,存储用户编号。

可保证用户全局唯一(避免用户反复的取消和关注影响数据记录),且数据基于Hash乱序存储,取出的直接就是随机值。


sadd userlist xxxid


预计用户编号long类型,100万50MB, 1000万用户也仅500MB。


📐step2:

抽奖时,直接使用spop,弹出随机的100个用户编号,该操作是原子性,先弹出再返回,在加上Redist命令队列单线程,不存在并发问题,杜绝重复中奖。


📐step3:

执行1次select in,提取数据,因为都是通过主键提取,效率快也不存在in索引失效问题,但要注意in的数量上限是1000个,超过1000个备选项要拆成多个in。


🍮 2.4 纯Redis

内存充足不差钱时可用。因为抽奖结果页面通常只显示用户昵称,还可使用Rdis提速,用内存换时间。


sadd userlist '123456:ikun'

sadd userlist '123456:akun'

sadd userlist '123456:bkun'


估算千万用户需3G内存,spop提取速度完全可控制在3ms内完成,且不重复。


Redis不怕Key多,只是怕大Key。测试结果:

1.png2.png

1000次pop执行时间2565,即每次 pop 只需 2.5ms。


🍚 3 总结

你有什么更好的方案吗?

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
easyexcel Java Maven
百万数据excel导出功能怎么做
百万数据excel导出功能怎么做
235 0
|
1月前
|
存储 缓存 监控
微信团队分享:微信后端海量数据查询从1000ms降到100ms的技术实践
针对大数据量带来的查询性能问题,微信团队对数据层查询接口进行了针对性的优化,将平均查询速度从1000ms+优化到了100ms级别。本文为各位分享优化过程,希望对你有用!
32 2
|
4月前
|
C# 索引
C# | 【完全开源】手机号码归属地查询,一秒内百万次查询
这个开源项目是一个.NET库,可以通过手机号码获取号码归属地信息,包括运营商、国家、省份、城市、邮政编码、区号等信息。 该库加载了一个包含46万条数据的“中国手机号归属地信息”数据集,并实现了高速查询。在我的7年老笔记本上执行一百万次查询耗时不足一秒。
144 0
|
5月前
|
NoSQL Redis
淘东电商项目(75) -秒杀系统(用户操作频率限制)
淘东电商项目(75) -秒杀系统(用户操作频率限制)
30 0
|
8月前
|
Java Spring
统计业务方法耗时【项目 商城】
统计业务方法耗时【项目 商城】
69 0
统计业务方法耗时【项目 商城】
|
9月前
|
存储 缓存 Dart
如何处理直播实时在线人数显示并且最小化性能和资源消耗?
直播技术成为一种极为流行的交流方式。而直播平台的核心指标之一就是实时在线人数,准确地显示该指标对于用户和运营商来说都具有重要意义。然而,直播实时在线人数的显示也面临着性能和资源消耗的挑战。本文将介绍如何利用Flutter和Dart开发技术栈来优化直播实时在线人数的显示,以达到最小化性能和资源消耗的目标。 作者:狗头大军之江苏分军 链接:https://juejin.cn/spost/7255473856234913852 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如何处理直播实时在线人数显示并且最小化性能和资源消耗?
|
11月前
|
存储 消息中间件 缓存
系统设计:从零用户扩展到百万用户
设计一个支持百万用户的系统是具有挑战性的,这是一段需要不断改进和不断提升的旅程。在本章中,我们将构建一个支持单个用户的系统,并逐渐扩展以服务于数百万用户。阅读本章后,您将掌握一些技巧,帮助您解决系统设计面试问题。
系统设计:从零用户扩展到百万用户
|
安全 Go 区块链
分投趣fintoch开发丨fintoch分投趣系统开发方案详细丨分投趣fintoch系统源码案例
  DAPP是Decentralized Application的缩写,即去中心化应用,也有人称为分布式应用。它被认为开启了区块链3.0时代。DAPP就是在底层区块链平台衍生的各种分布式应用,是区块链世界中的服务提供形式。DAPP之于区块链,有些类似APP之于IOS和Android。
|
存储 SQL 分布式计算
用户/帖子/好友/订单中心如何进行数据库水平切分
用户/帖子/好友/订单中心如何进行数据库水平切分
|
SQL 消息中间件 Java
百万级数据excel导出功能如何实现?
这个功能挺有意思的,里面需要注意的细节还真不少,现在拿出来跟大家分享一下,希望对你会有所帮助。 原始需求:用户在UI界面上点击全部导出按钮,就能导出所有商品数据。
542 0
百万级数据excel导出功能如何实现?