首頁 >資料庫 >Redis >redis秒殺場景解決方案

redis秒殺場景解決方案

尚
轉載
2020-05-25 09:02:272819瀏覽

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 樂觀鎖定實現秒殺功能

它的優點如下:

訊息佇列對記憶體消耗較大,10000個請求,需要操作10000出隊列。容易造成記憶體資源瞬間爆棚

使用樂觀鎖定的邏輯,CPU相對來說消耗較低、記憶體資源佔用少

    $redis = new redis();
    $result = $redis->connect(&#39;127.0.0.1&#39;, 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;
        }
    }

更多redis知識請關注redis入門教學欄。

以上是redis秒殺場景解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除