運用redis實現(xiàn)高并發(fā)下的抽獎功能

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ù)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容