
项目不考虑分布式, 但是上线之后,用户并发注册的情况会很大,而且要求不能用自增,数字不能包含 0
时间成本有限,不能太复杂了,所以我想到最简单的方案: 每次直接程序内生成一个 8 位数,再去 user 表 for update 后找一下看有没有。
还想到的一种方法:直接在 redis 队列中生成 100w 个均匀分布,每次 pop 一个
大家有啥好的思路没?
1 herozhang 2018-12-11 21:21:53 +08:00 via iPhone 提前生成好,来一个激活一个 |
2 xern 2018-12-11 21:36:16 +08:00 via Android GUID 了解一下 |
5 bolide2005 2018-12-11 22:29:21 +08:00 时间戳加随机数 |
6 egen 2018-12-11 22:32:16 +08:00 redis 的方案吧,for update 还是慢 |
7 mocxe2vwww OP |
8 innoink 2018-12-11 23:15:29 +08:00 via Android 8 位是 1000w,这个量其实不小 |
9 innoink 2018-12-11 23:17:21 +08:00 via Android @mocxe2vwww 截取能保证不重复么 |
10 innoink 2018-12-11 23:20:53 +08:00 via Android 如果不考虑完全随机 可以每次拿一个区间,random shuffle 以后使用 每次的区间不重叠就行了 |
11 john1989 2018-12-11 23:28:16 +08:00 via Android 线性同余法 |
12 580a388da131 2018-12-11 23:41:15 +08:00 via iPhone 排排队就好了,没必要弄那么复杂。 短期注册量大也就大那一会而已。 |
13 leavan 2018-12-11 23:44:10 +08:00 平方探测 |
14 xenme 2018-12-11 23:51:39 +08:00 via iPhone 基于用户名是生成 hash,找找主流 hash 算法,改造下成 8 位就好。 |
15 swulling 2018-12-12 00:10:59 +08:00 via iPhone 看你的用户量了,不超过百万量级完全可以在 redis 里维护一个 id set,每次新用户注册随机生成一个,验证是否在 set 里,如果在重复生成即可。 这个实现起来是最快的,只需要几行代码… |
16 Zzdex 2018-12-12 00:17:58 +08:00 via iPhone 提前生成吧 1000w 不是很多啊 |
17 akira 2018-12-12 00:32:14 +08:00 这个要的应该是用户数字 id 吧,这个没必要和唯一主键挂钩啊. 建议用户表还是用自增字段做唯一主键,另外创建一个表是 自增 id->user_id 映射关系表,提前填写好数据,这样创建新用户的时候,sql 里面直接写就好了. |
18 kernel 2018-12-12 09:14:44 +08:00 看这情况这只是个个人小项目,你会有 1000 万用户吗? 10w 顶多了吧,提前生成 10w 就行了。真有 10w 用户了再生成下一批。 |
19 700388 2018-12-12 10:04:39 +08:00 太简单了吧,直接随机生成 8 位数字,再匹配是否生成过,没有生成过,就完事,生成过,在生成一次匹配。 |
20 adgad2 2018-12-12 10:24:19 +08:00 有同样的需求、、、用的 redis 的做法,提前生成好,然后取 |
21 mocxe2vwww OP @akira 你这方法感觉简单实用 |