老大让我做个红包雨的功能,主要写后端,暂时没想到好的实现思路~

2017-04-11 15:49:28 +08:00
 Waterchestnut

我打算这么设计,给前端提供一个 htttp 接口,接口请求过来随便发放金额,诶,这个红包概率怎么控制?后面用原子计数器来计算红包数量,当达到老大给的数量上线和金额上线就告诉用户抢完了= =貌似 这样太粗糙。。暂时也想到好的解决方案

7699 次点击
所在节点    Java
34 条回复
MrFireAwayH
2017-04-11 15:56:49 +08:00
红包写最高 8888

后端控制下随机生成 0~50 的数
subdued
2017-04-11 15:59:21 +08:00
关注一波
torbrowserbridge
2017-04-11 15:59:29 +08:00
上线后请 @ 我 URL 页面,谢谢
Troevil
2017-04-11 15:59:41 +08:00
奖池机制,先分配好奖池,然后在奖池里面随机抽取.
xgfan
2017-04-11 16:02:44 +08:00
先把红包生成好。再随机发出去。发完就暂停。搞得细的话,还可以按小时分。
A3m0n
2017-04-11 16:03:06 +08:00
前些天做了个巨粗糙的抢红包
https://ooo.0o0.ooo/2017/04/11/58ec8cc8b4243.png
就是想模拟一下微信的抢红包算法
算法参考下面这个回答
https://www.zhihu.com/question/22625187
bramblex
2017-04-11 16:05:12 +08:00
@MrFireAwayH 花雅酱上班摸鱼~
jianzhiyao020
2017-04-11 16:30:02 +08:00
第一步:离线生成相应数量和金额上线的红包队列
第二步:写代码去抢啊,控制好冲突
第三步:也是最重要的一步,上线后请通知我。
xiaoyang7545
2017-04-11 16:33:27 +08:00
@jianzhiyao020 这种东西如果用数据库实现好像就会有 冲突(后一个查询请求到来时,前面的未更新)。用什么方式防止冲突比较好?
gamexg
2017-04-11 16:51:25 +08:00
预先生成红包,然后抢的时候直接 UPDATE 一条所有者是空的红包,将所有者设置为当前用户。
之后在执行次查询找到被更新的红包。

如果允许抢多个红包,那么更新时记得加个随机数,查询时带上好区分多个红包。

当然上 Redis ,用队列功能更简单。
rswl
2017-04-11 16:54:06 +08:00
上线记得喊一下
AlisaDestiny
2017-04-11 17:03:05 +08:00
可以预计算一个分配数组比如[0,1,0,,0,1].这样的话就是第二个人和第四个人有红包。可以控制概率。但是要做好每个用户抢的次数限制。
AlisaDestiny
2017-04-11 17:04:13 +08:00
尴尬。写错了。是[0,1,0,0,1] 第二个和第五个。
jianzhiyao020
2017-04-11 17:36:22 +08:00
@xiaoyang7545
redis 单线程帮到你,
可以用队列的形式存储红包数据,
速度快,
且数据不会有冲突。

mysql 的话,
首先可能想到的是锁:
可以在事务中 select ... for update 锁住该行队列数据,
不让别人修改。
并在 update 的条件中中做好控制即可。
这样的话可能会产生这个队列阻塞问题,
需要用哈希随机碰撞红包,
但是这样也同样会可能红包比较难碰撞的问题。

其实还可以这样做,
用一个新表去做,
主键子增,
通过插入记录获得 last_insert_id ,
再去红包表获取数据,
简单容易实现,
且不会有冲突的问题。


mysql 最好结合 redis ,
redis 计数, mysql 存储。

有错希望能够及时提出,感谢。
banksiae
2017-04-11 17:41:05 +08:00
不需要预分配,只要设置总额和个数就行了,金额随机生成, redis 做原子控制,防止刷红包,算法参考 A3m0n 提到的。
有个问题,抢红包人数多的话,就成了秒杀场景,所以抢之前要做下类似红包结束的判断。
最后就是异步发红包的问题,流水不能出错,保证幂等,基本就 OK 了
luluuulu4848
2017-04-11 17:41:23 +08:00
@xgfan 好主意啊
luluuulu4848
2017-04-11 17:43:25 +08:00
@banksiae 为什么不需要预分配,我觉得挺好的 先生成出来,求教
banksiae
2017-04-11 17:57:38 +08:00
@luluuulu4848 浪费存储空间,如果有 mysql 做,会有点性能问题;如果用 redis 预存储,浪费空间
x7395759
2017-04-11 23:55:33 +08:00
多少的量?少的话预分配最稳。
Waterchestnut
2017-04-12 00:15:31 +08:00
@MrFireAwayH 金额随机数为 1 , 2 , 3 , 5 , 10 ,在这几个数中随机,当然小额红包中奖率高一些

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

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

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

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

© 2021 V2EX