亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何設計高并發下的抽獎?

如何設計高并發下的抽獎?

胡子哥哥 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條經驗 獲得超6個贊

高并發下抽獎跟秒殺系統有些類似。
比如,中獎只是少數,大部分人并不會中獎。所以可以在第一步便限制只有少數用戶的請求能夠打到真正抽獎邏輯上。這樣一來服務器壓力就小了很多。
真正參與抽獎的用戶,先隨機下該用戶能不能中獎,中什么獎,如果是中了,再去查詢有沒有該獎(若沒有獎則顯示未中)。這樣,又減少了一些對數據庫的請求。
這樣,高并發也只限于http服務器,對數據庫的壓力不是很大。
                            
查看完整回答
反對 回復 2019-04-13
  • 2 回答
  • 0 關注
  • 373 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號