鍍金池/ 問答/Java  PHP  數(shù)據(jù)庫/ php 使用redis進行秒殺的思路

php 使用redis進行秒殺的思路

各位大大,問題大概是這樣的,因為項目中設(shè)計一個比較簡單的類似于秒殺的東西
但幾經(jīng)搜索之后 都說使用redis的原子性 采用隊列來處理, 然后去看了一下redis的一些命令
又結(jié)合了別人的一些代碼 大致思路是以下這樣

我有幾個問題
1.什么時候觸發(fā) 左進右出 取數(shù)據(jù)這個流程呢 ,條件是什么呢
2.還是說 把商品數(shù)量提到 檢查隊列長度之前??
3.或者說我的思路 本身就有很大漏洞或者 歪了

請不留情 斧正

   
   
   
    //用戶進入
    //獲取用戶信息
    //連接redis
    //加入隊列msList
    
    //這個位置檢查緩存的商品數(shù)量??   為0就直接返回了 不用進行下面的操作?
    
    //檢查隊列長度  
    //--1.大于200就返回  搶購人數(shù)過多,跳轉(zhuǎn)搶購結(jié)束頁面,結(jié)束,終止秒殺
    //--2.小于等于就加入隊列
    
    //判斷等于200觸發(fā)下面操作???

    //左進右出  取數(shù)據(jù)
    //----查詢商品數(shù)量為num   
    //-------1.無則 加入redis緩存   
    //-------2.有則判斷是否大于0 
    //----------1.小于等于就退出 ,跳轉(zhuǎn)庫存不足頁面,結(jié)束
    //----------2.無則判斷
    //-------------進入的用戶左進右出
    //-----------------事務(wù)
    //-----------------1.插入成功,num-1,返回用戶消息,結(jié)束
    //-----------------1.插入失敗,回滾,返回用戶消息,結(jié)束
    //釋放redis

    //訂單超時,庫存增加??
回答
編輯回答
不討喜

題主可以逆向思考這個秒殺問題,由于Redis的list數(shù)據(jù)結(jié)構(gòu)是不可能到達“負”長度的,所以可以把需要被秒殺的商品信息和一個唯一編號預(yù)先放到指定商品類型的唯一隊列中,用戶請求時直接lpop出結(jié)果,不可能出現(xiàn)超量的問題,很多東西都免了。

2017年4月25日 22:18