最近在学习it老齐的架构设计,课程里面有这样一个课题,如何实现3ms内从1000w级别的用户里面随机抽取出100m用户。

首先,我们先从常规的常规的sql出发,如果要从数据表里面随机的选出几名员工的话,可能会使用mysql的相关函数

select username from user order by rand() limit 10

但是我们知道在mysql里面使用order by rand会让数据库性能呈指数级下降。因为MySQL会不得不去执行RAND()函数(很消耗CPU的时间),而且这是为每一条记录及取值,然后再对其排序,所以这种方法不推荐。

那么,我们来考虑使用第二种改进的方案。

方案二、

offset = select FLOOR(RAND()*COUNT()) AS offset FROM 关注用户表;

select * from 活动用户表 limit offset 1;

性能尚可,但是因为要执行两条语句,所以可能存在原子性的问题,且不能保证不会存在重复中奖的可能性。

接着,我们再深入思考,可不可以通过Redis这种方案来进行优化能

方案三、基于redis set集合做随机弹出

        通过redis的set类型来做入栈和出栈的操作来随机抽出100名用户

具体实现方法:在用户关注直播间的时候,写入MySQL的同时额外在Redis增加userlist Set集合,存储用户编号。

sadd userlist userid1 userid2 userid3...

添加完成之后,预计1000w用户预计占用500M内存空间。

然后,从里面随机弹出100位用户即可。

spop userlist 100

10000009
10000034
10000453
10000053
10000034
10000434
.....

select username from 关注用户表 where id in (10000009,10000034,10000453,10000053,10000034,10000434);

这种做法的好处是,使用redis来取代了mysql获取中奖员工编号,提升了效率, 属于用空间换时间的做法,大大的提升了效率,但是仍然没有完全摆脱MySQL,最后一步,仍然是从MySQL中取值,没有把效率发挥到极致。

最后,我来放大招了。

方案四、完全使用Redis实现

sadd userlist "10011515:gaos" "1004554454:ccf" "121432452:zhangxr"....

然后从里面随机弹出100个元素

spop userlist 100

最后,对于弹出的结果进行相应的处理,只显示对应的用户名称即可。

import redis
from random import randintif __name__ == '__main__':redis_conn = redis.Redis(host="127.0.0.1", port=6379, password="")print(redis_conn)for i in range(100000):num_int = str(i).zfill(6)redis_conn.sadd("userlist", f"{randint(10000000,99999999)}:ccf{num_int}")s2 = redis_conn.spop("userlist", 10)print("获奖的员工为:")for s in s2:if len(s.decode("UTF-8").split(":")) > 1:print(s.decode("UTF-8").split(":")[1])

执行完成之后,可以发现pop操作的时间控制在了3ms内,该方案有效!

【架构设计】如何实现3ms内从1000w级别的用户里面随机抽奖出100名用户相关推荐

  1. 架构篇:什么才是真正的架构设计?

    一. 什么是架构和架构本质 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解.此君说的架构和彼君理解的架构未必是一回事.因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识这 ...

  2. 什么是真正的架构设计?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 来源:rrd.me/g5r37 一. 什么是架构和架构本 ...

  3. 云原生时代微服务的高可用架构设计

    简介: 在8月20日"阿里巴巴技术质量精品课"上,来自蚂蚁的经国分享了对云原生时代微服务的高可用架构设计的全面解析,为大家介绍了应用架构演进路径.云原生时代的技术福利.高可用架构的 ...

  4. 蚂蚁金服资深技术专家经国:云原生时代微服务的高可用架构设计

    经国 蚂蚁金服数字金融线担任技术风险架构师 读完需要 15 分钟 速读仅需 5 分钟 经国,蚂蚁金服资深技术专家,毕业于浙江大学. 2014 年加入蚂蚁金服,先后负责过支付宝的单元化.弹性.去 ORA ...

  5. 什么是真正的架构设计?十年Java经验让我总结出了这些,不愧是我

    一. 什么是架构和架构本质 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解. 此君说的架构和彼君理解的架构未必是一回事.因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识 ...

  6. 十年Java经验让我总结出了这些,什么是真正的架构设计?

    一. 什么是架构和架构本质 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解. 此君说的架构和彼君理解的架构未必是一回事.因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识 ...

  7. 【Java进阶营】什么是真正的架构设计?某厂十年Java经验让我总结出了这些,不愧是我

    一. 什么是架构和架构本质 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解. 此君说的架构和彼君理解的架构未必是一回事.因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识 ...

  8. 坐等膜拜|什么是真正的架构设计?十年Java经验让我总结出了这些,不愧是我

    一. 什么是架构和架构本质 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解. 此君说的架构和彼君理解的架构未必是一回事.因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识 ...

  9. 什么是真正的架构设计?某厂十年Java经验让我总结出了这些,不愧是我

    本文转载自:什么是真正的架构设计?某厂十年Java经验让我总结出了这些,不愧是我 一. 什么是架构和架构本质 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解. 此君说的架构和彼君理解 ...

最新文章

  1. mysql数据库备份提示1577_mysqldump备份数据库时出现when using LOCK TABLES的提示
  2. 用hutool进行RSA编码及解码
  3. 数据结构 -- 搜索二叉树
  4. android listview edittext 事件,Android ListView item中含有Edittext 中一些坑
  5. selenium 4_Selenium4 Alpha –期望什么?
  6. 计算机系统计算机,计算机系统与计算机化系统的区别
  7. Bash数组操作教程
  8. eval()解析JSON
  9. c语言程序设计课程设计心得体会,C语言程序课程设计心得体会
  10. Idea配置sbt(window环境)
  11. android发送json格式,如何在Android上以JSON发送文件?
  12. Android Handler机制之总目录
  13. Java获取本机ip地址的代码
  14. 一、VMware及win10虚拟机的安装及环境配置
  15. OpenCV—Python 导向滤波
  16. 腾讯微博qq说说备份导出工具_曾经比微信还火,3亿人用过的腾讯软件,如今彻底凉了...
  17. 设计稿 自动html,简单的登陆页面PSD设计稿来演示转化为HTML页面的全部过程
  18. 计算机的磁盘管理在哪,磁盘管理器在哪
  19. Docker 导出/导入镜像
  20. 超级用户su没有权限修改所属

热门文章

  1. 绘制同心圆-第12届蓝桥杯Scratch省赛1真题第3题
  2. 搭建nexus私服:nexus-3.19.1-01
  3. Excel如何实现两个工作表数据的对比
  4. 将字符串中的小写字母转换成大写字母
  5. 你或许也想拥有专属于自己的AI模型文件格式(推理部署篇)-(8)
  6. matlab输出多个参数到表格固定列,matlab将excle的列提取出来?如何使用Matlab提取Excel中指定列的数据?...
  7. 通俗易懂:什么是.NET?.NET Framework?.NET Core?(比较全面)
  8. 【Markdown】Markdown插入图片的完美解决方法
  9. 用anacnda创建虚拟环境用不用指定python版本
  10. Day_06 传智健康项目-移动端开发-体检预约