生成 8 位数字 作为用户的唯一主键, 如何保证唯一?

2018-12-11 21:18:46 +08:00
 mocxe2vwww

项目不考虑分布式, 但是上线之后,用户并发注册的情况会很大,而且要求不能用自增,数字不能包含 0

时间成本有限,不能太复杂了,所以我想到最简单的方案: 每次直接程序内生成一个 8 位数,再去 user 表 for update 后找一下看有没有。

还想到的一种方法:直接在 redis 队列中生成 100w 个均匀分布,每次 pop 一个

大家有啥好的思路没?

6033 次点击
所在节点    问与答
21 条回复
herozhang
2018-12-11 21:21:53 +08:00
提前生成好,来一个激活一个
xern
2018-12-11 21:36:16 +08:00
GUID 了解一下
nightv2
2018-12-11 21:50:55 +08:00
@xern +1
herozhang
2018-12-11 22:28:04 +08:00
@xern lz 说了只要 8 位数字
bolide2005
2018-12-11 22:29:21 +08:00
时间戳加随机数
egen
2018-12-11 22:32:16 +08:00
redis 的方案吧,for update 还是慢
mocxe2vwww
2018-12-11 22:36:15 +08:00
@xern 好吧,正好在看文档,https://docs.sqlalchemy.org/en/latest/core/custom_types.html

uuid 转 int,截取后 8 位, 实验下
innoink
2018-12-11 23:15:29 +08:00
8 位是 1000w,这个量其实不小
innoink
2018-12-11 23:17:21 +08:00
@mocxe2vwww 截取能保证不重复么
innoink
2018-12-11 23:20:53 +08:00
如果不考虑完全随机

可以每次拿一个区间,random shuffle 以后使用
每次的区间不重叠就行了
john1989
2018-12-11 23:28:16 +08:00
线性同余法
580a388da131
2018-12-11 23:41:15 +08:00
排排队就好了,没必要弄那么复杂。
短期注册量大也就大那一会而已。
leavan
2018-12-11 23:44:10 +08:00
平方探测
xenme
2018-12-11 23:51:39 +08:00
基于用户名是生成 hash,找找主流 hash 算法,改造下成 8 位就好。
swulling
2018-12-12 00:10:59 +08:00
看你的用户量了,不超过百万量级完全可以在 redis 里维护一个 id set,每次新用户注册随机生成一个,验证是否在 set 里,如果在重复生成即可。

这个实现起来是最快的,只需要几行代码…
Zzdex
2018-12-12 00:17:58 +08:00
提前生成吧 1000w 不是很多啊
akira
2018-12-12 00:32:14 +08:00
这个要的应该是用户数字 id 吧,这个没必要和唯一主键挂钩啊.
建议用户表还是用自增字段做唯一主键,另外创建一个表是 自增 id->user_id 映射关系表,提前填写好数据,这样创建新用户的时候,sql 里面直接写就好了.
kernel
2018-12-12 09:14:44 +08:00
看这情况这只是个个人小项目,你会有 1000 万用户吗? 10w 顶多了吧,提前生成 10w 就行了。真有 10w 用户了再生成下一批。
700388
2018-12-12 10:04:39 +08:00
太简单了吧,直接随机生成 8 位数字,再匹配是否生成过,没有生成过,就完事,生成过,在生成一次匹配。
adgad2
2018-12-12 10:24:19 +08:00
有同样的需求、、、用的 redis 的做法,提前生成好,然后取

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

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

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

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

© 2021 V2EX