redis緩存解決并發(fā)訪問問題。
抽獎總數(shù)出現(xiàn)負數(shù)解決方案:
1.redis隊列的pop操作是原子性的,即一個操作發(fā)出后,不換線程一直到結(jié)束,
即使有很多用戶同時到達,也是依次執(zhí)行。
2.具體方案:
普通實現(xiàn)方案:在生成序列號、更新數(shù)據(jù)庫之前,判斷隊列的庫存數(shù)量(提前設定
庫存數(shù)量),lpop數(shù)據(jù),如果還有則執(zhí)行,沒有則返回。
一個用戶搶一個:需要一個排隊隊列和抽獎結(jié)果隊列及庫存隊列。高并發(fā)情況,
先將用戶進入排隊隊列,用一個線程循環(huán)處理從排隊隊列取出一個用戶,判斷用
戶是否已在搶購結(jié)果隊列,如果在,則已搶購,否則未搶購,庫存減1,寫數(shù)據(jù)
庫,將用戶入結(jié)果隊列。
3.優(yōu)勢
1)將庫存字段number字段設為unsigned,當庫存為0時,因為字段不能為負
數(shù),將會返回false
2)使用MySQL的事務,鎖住操作的行
3)使用非阻塞的文件排他鎖
使用上述的方法也可以實現(xiàn)高并發(fā)下抽獎功能不會出現(xiàn)負數(shù)但是MySQL
事務以及文件鎖會在高并發(fā)下性能下降厲害,而且使用redis方案可以靈活
準確控制用戶能抽中獎的次數(shù)。
運用redis實現(xiàn)高并發(fā)下的抽獎功能
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
相關(guān)閱讀更多精彩內(nèi)容
- 參考:http://blog.csdn.net/nuli888/article/details/51865401
- 歡迎大家關(guān)注我的其他 Github博客 和 Csdn ,互相交流! 博主最近在項目中遇到了搶購問題!現(xiàn)在分享下。搶...
- 搶購、秒殺是如今很常見的一個應用場景,主要需要解決的問題有兩個: 高并發(fā)對數(shù)據(jù)庫產(chǎn)生的壓力 競爭狀態(tài)下如何解決庫存...
- 今天元宵天氣有點冷,鄉(xiāng)鎮(zhèn)上的街道冷冷清清,行人廖廖無幾。 18:20,這個點很多人都在家里吃團圓飯了吧,這時街道上...