为了账号安全,请及时绑定邮箱和手机立即绑定

如何设计高并发下的抽奖?

如何设计高并发下的抽奖?

胡子哥哥 2019-04-13 08:36:50
我写的伪代码如下,但出现了个bug,抽奖现在要限制每日抽奖结果出现的次数,但实际运行是在并发时不能限制住,如何解决?resultDayLimitTimes={resultA=>2#每天最多出现2次resultB=>5#每天最多出现5次resultC=>20#每天最多出现20次resultD=>Infinite#每天出现次数没有限制}Begintransactionselect*fromlottery_chancewhereid=XXandresult=nulllimit1forupdate#bug就在下面这个循环里,如果resultA今天已经出现过一次了,#然后有2个人(这2人的XX是不同的,所以前面的forupdate对#于这种并发不能限制,前面的forupdate是用来防止同一次抽奖机会被并发时使用多次的)#同时抽到YY=resultA,由于事务还未提#交那么yyCount都是1,小于每日限制2,于是跳出循环,这2人#都中了resultA,这时当天出现了3个resultA超出2个限制,#我应该怎么写才能解决这个问题?whiletrue{YY=randomIn[resultA,resultB,resultC,resultD]yyCount=selectcount(*)fromlottery_chancewhereresult=YYandused_time>todayDateifyyCount
查看完整描述

2 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

高并发下抽奖跟秒杀系统有些类似。
比如,中奖只是少数,大部分人并不会中奖。所以可以在第一步便限制只有少数用户的请求能够打到真正抽奖逻辑上。这样一来服务器压力就小了很多。
真正参与抽奖的用户,先随机下该用户能不能中奖,中什么奖,如果是中了,再去查询有没有该奖(若没有奖则显示未中)。这样,又减少了一些对数据库的请求。
这样,高并发也只限于http服务器,对数据库的压力不是很大。
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 332 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信