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

IT科技2025-11-05 02:59:1922543
1 需求

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

同一用户不能重复参与同一用户不允许二次中奖2 设计方案

2.1 最原始

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

复制select * from 关注用户表 order by rand() desc limit,千万0,1001.

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

2.2 N次随机选择SQL

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

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

select * from 关注用户表 limit offset,用s级11.2.

2.3 Redis Set随机弹出

step1:在用户关注直播间在写入MySQL关注用户表时,再往Redis增加一个userlist Set,抽奖存储用户编号。设计可保证用户全局唯一(避免用户反复的千万取消和关注影响数据记录),且数据基于Hash乱序存储,用s级取出的抽奖直接就是亿华云随机值。

复制sadd userlist xxxid1.

预计用户编号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:ikunsadd userlist 123456:akunsadd userlist 123456:bkun1.2.3.

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

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

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

服务器租用
本文地址:http://www.bhae.cn/news/01b7199927.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

全站热门

雷神电脑轻松使用教程(让你掌握雷神电脑的使用技巧)

DB2 物化查询表以及其他常用表的介绍

DB2 9 分布式管理的正确操作流程

IBM DB2在使用的过程中要注意的几个知识

联想电脑账户密码错误的原因及解决方法(探索联想电脑账户密码错误的背后问题,教你轻松解决困扰)

DB2数据库编目的概念以及对其的正确解析

DB2运行在Linux操作系统上备份时报SQL2009N错误

MySQL锁机制 你所不了解的一些事儿

友情链接

滇ICP备2023000592号-9