1000並發 3個獎品 保證秒殺穩定進行,並且中獎者和獎品數量不要出問題
這個問題怎麼處理 ,mysql的 希望各位有經驗的同學分享下經驗以及解決方案,謝謝,在先等
回複內容:
1000並發 3個獎品 保證秒殺穩定進行,並且中獎者和獎品數量不要出問題
這個問題怎麼處理 ,mysql的 希望各位有經驗的同學分享下經驗以及解決方案,謝謝,在先等
Redis 隊列
Redis 可以應對高並發情境,是因為它的讀寫請求均是單線程機制,不存在並發問題。而且 Redis 是基於記憶體的,讀寫速度也比 MySQL 快得多
因為獎品只有三個,所以無論多少個請求過來,最多隻能有三個請求可以正確獲得獎品,所以可以將大部分的請求不做任何處理,直接返回秒殺失敗,剩下很小的請求進入到下環節,此時並發很小,所以接下來的處理幾乎可以不再考慮並發問題。
當然此方案僅因為獎品數很少,如果獎品本身很多,即使拋棄大部分的請求,系統也承受較大並發衝擊,此時需要考慮其它方案。
請用緩衝把獎品全部加入到裡面。然後全部從緩衝裡秒,秒到了才更新資料庫
看你描述你的秒殺情境感覺比我們的稍微簡單一些,如果不考慮非常嚴謹的擴充性,只考慮當下,我感居然可以如下方式簡單實現:
假設你最佳化下mysql或升級下硬體,1000並發全部查詢mysql資料庫是否還有庫存,可以頂得住的話,那麼只需要一個佇列服務,把所有並發秒殺使用者全部進入到隊列逐條同步篩選出3個中獎使用者,然後在產生訂單的時候扣掉mysql裡面的庫存,並且響應給前端頁面檢測是否秒殺成功的進程即可,其他的997個使用者全部響應給前端進程秒殺失敗提醒
假設頂不住或者沒錢升級?那就用redis之類的服務把1000個獎品資訊存入緩衝,秒殺成功產生訂單的時候同步更新mysql和redis裡面的庫存數量
因為題主聲明了只使用MySQL,我認為可以這樣做:
1.將3個獎品放入一張表中;
2.到點後系統進入高並髮狀態,然後你們的獎品隨機演算法使使用者中獎並刪除記錄;
3.檢測表中是否還有資料;
也可以這樣:
1.建立一張中獎專用計數表;
2.到點後系統進入高並髮狀態,然後你們的獎品隨機演算法使使用者中獎並增加計數;
至於最佳化方案(暫時能想到的,希望大神補充):
1.儲存引擎使用 MEMORY
;
2.可以在程式入口處設定一個到期時間,3個獎品的話,10秒鐘足夠了,到期後入口關閉或跳轉;
最簡單的方法是把1000並發用隊列拉成線性就行了,當某個請求發現庫存沒了,以後的所有請求全部返回秒殺失敗。
才1000的並發/資料,為啥要用資料庫。資料庫的速度還是很慢很慢的。
伺服器直接為每個請求儲存一個時間戳記,然後排序就好了。反正使用者1-2秒之後獲得結果也不會有什麼特別的感覺。
將請求儲存到隊列,只取隊列的前三個值,後面的全部返回已售完。
需要一個佇列服務,把所有的並發秒殺使用者,全部進入到隊列逐條同步篩選出3個中獎使用者,然後在產生訂單的時候扣掉mysql裡面的庫存,並且響應給前端頁面檢測是否秒殺成功的進程即可,其他的997個使用者全部響應給前端進程秒殺失敗提醒
用 mysql 記憶體表。先用 hash user_id等方法隨機丟掉一部分請求
然後直接 update 記憶體表,例:
``
update award set user_id=xxx where id=1 and user_id=0
``