当前位置: 首页 > news >正文

千万级用户ms级抽奖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。测试结果:

在这里插入图片描述1000次pop执行时间2565,即每次 pop 只需 2.5ms。

🍚 3 总结

你有什么更好的方案吗?

相关文章:

  • 2022第五空间WEBMISC
  • 说几句得罪人的大实话
  • Spark 优化 (二) --------- Spark 数据倾斜
  • 第01篇:系统化学习, 搞定Spring容器管理
  • 【Android】-- Intent(显式和隐式Intent)
  • 【HashMap】HashMap的6种遍历方法
  • 网络中其他重要技术与协议(DNS系统,ICMP协议,NAT技术与代理服务器)
  • [仅需1步]企业微信群机器人[0基础接入][java]
  • 关于 vue keep-live 缓存时候,缓存页面高度不生效问题 :
  • 对比勒索病毒和熊猫烧香,谈如何保证服务器端数据安全?
  • 【网络】HTTP协议详解
  • vue3.0 如何自定义指令
  • 浅析RocketMQ-消息重建
  • Kickstarter众筹需要准备哪些资料?
  • 数据分享|函数型数据分析部分省市新冠疫情数据
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [译]前端离线指南(上)
  • 【附node操作实例】redis简明入门系列—字符串类型
  • AHK 中 = 和 == 等比较运算符的用法
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Cumulo 的 ClojureScript 模块已经成型
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Java读取Properties文件的六种方法
  • Java方法详解
  • JS 面试题总结
  • k8s 面向应用开发者的基础命令
  • MYSQL 的 IF 函数
  • PAT A1120
  • PHP的Ev教程三(Periodic watcher)
  • React+TypeScript入门
  • SQLServer之索引简介
  • Web设计流程优化:网页效果图设计新思路
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 巧用 TypeScript (一)
  • 如何用vue打造一个移动端音乐播放器
  • 使用Swoole加速Laravel(正式环境中)
  • 微信小程序:实现悬浮返回和分享按钮
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • ###C语言程序设计-----C语言学习(6)#
  • #define、const、typedef的差别
  • (03)光刻——半导体电路的绘制
  • (11)MATLAB PCA+SVM 人脸识别
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (27)4.8 习题课
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • .NET Core 版本不支持的问题
  • .net framework4与其client profile版本的区别
  • .net 生成二级域名
  • .net 托管代码与非托管代码
  • .net 无限分类
  • .Net中间语言BeforeFieldInit
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • /etc/skel 目录作用
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面