Redis--秒殺場景應用

在大流量程序開發中,必然會遇到高併發的應用的場景。解決方案大體分爲兩個方向, 消息隊列

redis 實現消息隊列核心簡單版本

$key = 'quque';
        /**
         * 秒殺商品數量有限,預先存儲到消息隊列
         */
        public function qnquque() {
            for($i = 1 ; $i<=5 ;$i++) {
                $redis->lpush($key,$i);
            }
        }
        
        /**
         * 這裏省略掉業務邏輯處理,默認業務邏輯處理完,出隊列
         */
        public function dequque() {
            $redis->rpop($key);
            /**
             *  這裏開始商品購買後的業務邏輯處理
             */
        }

消息隊列是防止超買超賣很好的一種解決方案,要實現消息隊列的高級功能須要用到專業的消息隊列工具例如(rabbitmq).用戶Redis 用戶redis實現消息隊列仍是有一些缺點的,能夠自行查找文章補充。這邊不一一律述。最大問題仍是分佈式集羣的問題。redis

Redis 樂觀鎖實現秒殺功能

它的優勢以下:併發

  1. 消息隊列對內存消耗較大,10000個請求,須要操做10000 出隊列。容易形成內存資源瞬間爆棚
  2. 使用樂觀鎖的邏輯,CPU相對來講消耗較低、內存資源佔用少
$redis = new redis();
    $result = $redis->connect('127.0.0.1', 6379);
    $cachekey = $redis->get("cachekey");
    $number = 100;   //搶購數量
    if($cachekey<$number){
        $redis->watch("cachekey");
        $redis->multi();
        
        //設置延遲,方便測試效果。
        sleep(5);
        //插入搶購數據
        $redis->hSet("cachekeyList","user_id_".mt_rand(1, 9999),time());
        $redis->set("cachekey",$cachekey+1);
        $result = $redis->exec();
        if($result){
            $cachekeyList = $redis->hGetAll("cachekeyList");
            echo "恭喜".$cachekeyList."搶購成功!<br/>";
        }else{
            echo "再接再礪";
            exit;
        }
    }

結尾

本文並無從零開始業務分析,都是核心的業務邏輯代碼。須要結合實際的業務場景嵌入本文的核心實現邏輯。嘿嘿~分佈式

相關文章
相關標籤/搜索