有 A 、 B 两种商品可以让用户认购
每认购一份则生成一个号码
不同商品产生的号码可以相同
且最终开奖也从号码中抽取
假定 A 商品需要认购满 5000 件才开始揭晓获奖者
那么
用户认购 100 份,就要生成 100 个号码
怎么保证在同一个商品中的号码只被一个用户使用呢?
我目前想到的方法有性能缺陷
想听一下 V 友们的意见:)
1
freeminder 2016-10-10 18:05:06 +08:00
额,认购有记录的吧,不用额外数据就行呀,记录的 id 就是抽奖号码。最后满足抽奖条件时在记录表上面 random 一下不就完了。不明白什么意思。。
|
2
liuzhen OP @freeminder “在记录表上面 random 一下” 这句我没太看明白~
|
3
liuzhen OP 不能 append 了
以问题中的假定为例:我想最终的号码规则是: 100005000 以内的数字 前面的 10000 是固定加的,后面的 5000 代表总需要的认购数 然后用户认购 100 份,需要在 5000 以内生成 100 随机数 怎样保证在一定效率的情况下 在同一个商品中的号码只被一个用户使用呢?(要考虑并发效率) |
4
jininij 2016-10-10 18:18:38 +08:00 via Android 1
1~N 的数组,打乱,在产品上架的时候就生成了。购买几个就 pop 几个
|
5
sutra 2016-10-10 18:23:35 +08:00
不能用连续的数字吗?
|
7
jecky15 2016-10-10 18:36:53 +08:00 1
10000+N 方式 切打乱生成好,买多少出多少(也需要打乱)
|
9
jecky15 2016-10-10 18:39:23 +08:00
5000 代表生成号码数量 一般为 10000+5000 循环生成号码在发布商品的时候切号码打乱;
100 然后从 5000 个吗中 pop 100 个; |
11
sutra 2016-10-10 18:50:08 +08:00
比如用 redis 的 INCR 或者 INCRBY 。
|
14
good 2016-10-10 19:34:46 +08:00
使用 redis https://www.v2ex.com/t/290293
|
15
freeminder 2016-10-11 09:37:49 +08:00
@liuzhen 那就写一个方法将连续的数字转换为看似不连续但是有规律的数字呗,这样在数据库中还是使用的连续自增 id ,只不过用户看到的是一个转化后的结果。最后抽奖还是在连续的里面抽,公布的时候用同样的转换算法。其实底层全是自增 id 。
|