使用redis實現秒殺功能
阿新 • • 發佈:2019-02-03
秒殺功能描述:
首先頁面上有四個主要功能:
1、商品資訊(你要搶的是什麼商品)
2、倒計時(120、199、198...,也可以是整點秒殺)
3、商品數量變化(支付成功一件,數量減少一件,如果使用者取消購買,重新加入到佇列)
4、搶購按鈕(使用者點選搶購)
為什麼要使用redis實現秒殺:
1、使用redis列表的原子特性,即使多個使用者同時到達,也會依次執行,這樣就防止超賣多賣現象的產生了。
2、redis是快取資料庫,資料直接儲存在記憶體中,讀取效率高。
PS:使用mysql也可以實現秒殺功能,實現原理就是加鎖,當多個使用者同時對一個欄位進行修改時,給資料加鎖,只有當事物提交或者回滾時才會釋放鎖。for update(加鎖)語句只能放到select中,只有當查詢時把資料鎖住才有意義
BEGIN;
INSERT INTO stock_log VALUES
SELECT count FROM stock WHERE id=1 AND count>0 FOR UPDATE;
UPDATE stock SET count = count -1 WHERE id=1 AND count > 0;
COMMIT;
實現思想:
首先商品數量變化可以使用ajax輪詢的方式,請求介面,這個介面查詢redis對列的數量,並返回。
當用戶點選搶購時,從佇列中pop一個或多個(使用者購買數量,可以限制)元素,然後進行支付操作,支付成功後,向mysql中加入訂單資訊,如果使用者取消或者支付失敗,將商品重新新增到佇列中。
如果要做使用者等級(會員、非會員),可以增加一個會員使用者的對列,每次點選搶購時,如果是會員先將會員加入對列,當會員對列沒有使用者時,普通使用者才能購買。