摇号系统如何快速确定空值

2018-07-14 03:22:24 +08:00
 vloony

mysql 摇号系统如何更有效率的确定 10000-99999 之间的未使用的值

现有方案是从随机一个数开始,查询是否占用》占用+1 继续查询 直到没有占用

效率非常低 数据库经常挂 有什么高效率的查询方法 求大神指导

3780 次点击
所在节点    MySQL
16 条回复
34C
2018-07-14 03:41:21 +08:00
空间换时间,先把所有的号记录到数据库,摇号的时候 select 未使用的 并且随机排序
chengluyu
2018-07-14 04:08:52 +08:00
1L 的答案足够了。数据范围很大的话可以考虑用个非平凡哈希函数。
yangqi
2018-07-14 04:11:33 +08:00
不连续的没有高效的办法,最好的就是增加一个连续的 id 专门用来摇号。
GoPython
2018-07-14 05:50:18 +08:00
为什么我一看到题目就先想到加载到 redis 缓存?
wenzhoou
2018-07-14 07:30:22 +08:00
楼主,你现在这个方案,完全重定义了随机,知道不?
atcdef
2018-07-14 07:41:56 +08:00
一共才不到 10 万个整数,python 直接生成这样一个列表,random.choice,再从列表里删了,就行了。
leafleave
2018-07-14 07:45:07 +08:00
摇到一个值后,把它从原数据库里面删除再摇
zcjfesky
2018-07-14 07:49:26 +08:00
你这个“查询到不占用就设为占用”的需求让我觉得你为什么不直接随机打乱数组然后从头到尾输出整个数组…
opengps
2018-07-14 08:14:14 +08:00
1 楼方案可以,先查出来所有的空号,然后用空号去随机
eslizn
2018-07-14 09:07:13 +08:00
就楼主说的这个量级且只使用 mysql 的情况下可以考虑下这种做法
UPDATE table SET user_id = 当前用户 id WHERE user_id = 0 ORDER BY RAND() LIMIT 1;
lihongjie0209
2018-07-14 10:03:56 +08:00
最简单的: 首先生成 10000-99999 所有的数字, 随机打乱, 插入数据库. 用的时候取第一条并删除. 如果使用失败, 那么就添加到数据库的最后一条.

用数据库主要是为了持久化, 然后模拟一个 queue 就可以了
reus
2018-07-14 10:08:03 +08:00
update numbers
set used = true
where num = (
select num from numbers
where not used
order by random()
limit 1
)
returning num
qiayue
2018-07-14 10:12:42 +08:00
@lihongjie0209 最近刚做完一个抽奖 H5,总共才 2 万个奖品,我就是先生成 2 万条记录,乱序后插入数据库,用的时候,每次去一条。

这种方式就像彩票店的刮刮奖,彩票事先生产制作出来了(理想情况,大奖没有被事先拿出),并且也是打乱顺序的
lihongjie0209
2018-07-14 10:17:21 +08:00
@qiayue #13 对的
zjqzxc
2018-07-14 11:03:50 +08:00
位图法
遍历一遍,根据 id 生成一个 bitmap,若为 0 就是对应的 id 为空,为 1 就是占用
九万个记录,一共 11.25KB,放内存轻轻松松。

如果以后经常要用,加入新记录到时候同时操作下这个 bitmap 即可
vloony
2018-07-17 13:06:16 +08:00
感谢所有回复的提供解决方案的人~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/470786

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX