用户抽奖
需要考虑并发问题,用户可能高频点击抽奖按钮,所以后台需要对用户id做分布式锁来防止重复抽奖。
若要限制用户的每天抽奖次数,可考虑用缓存做限制,redis的hset很合适。
抽奖流程
- 生成编码code:一个随机数,限定在(0~n)范围内
- 每种奖品有自己的中奖编码区间,如 A奖品:(0-9999) , 那它的中奖概率就是 9999/n
- 遍历所有奖品,如果发现code在该奖品的中奖编码区间内,就中奖了
奖品发奖计划
假如抽奖活动持续一段时间,例如5天,那么就不应该让用户在第一天就把所有奖品都抽完。
所以应该制定奖品的发放策略,每一段时间释放一批奖品,被释放的奖品才可被抽中。
所以需要设置定时任务,定期地从数据库中更新奖品数量(取n个),然后将这n个奖品放进奖品池(可考虑Redis的hset),抽奖的请求从奖品池中抽取奖品。
那么每一种奖品的发放策略是不一样的,如A奖品有1000个,5天发完,那么应该一天取1000个放进奖品池。而B奖品只有5个,那么应该一天取1个放进奖品池。可考虑 时间:数量 的数据格式来设置奖品的某一段时间的发放数量。