Heim  >  Artikel  >  Datenbank  >  Redis-Flash-Sale-Szenariolösung

Redis-Flash-Sale-Szenariolösung

尚
nach vorne
2020-05-25 09:02:272727Durchsuche

Redis-Flash-Sale-Szenariolösung

Bei der Entwicklung von Programmen mit hohem Datenverkehr werden Sie unweigerlich auf Anwendungsszenarien mit hoher Parallelität stoßen. Die Lösung ist grob in zwei Richtungen unterteilt: Nachrichtenwarteschlange und Sperre.

redis implementiert eine einfache Version des Nachrichtenwarteschlangenkerns

        $key = 'quque';
        /**
         * 秒杀商品数量有限,预先存储到消息队列
         */
        public function qnquque() {
            for($i = 1 ; $i<=5 ;$i++) {
                $redis->lpush($key,$i);
            }
        }
        
        /**
         * 这里省略掉业务逻辑处理,默认业务逻辑处理完,出队列
         */
        public function dequque() {
            $redis->rpop($key);
            /**
             *  这里开始商品购买后的业务逻辑处理
             */
        }

Nachrichtenwarteschlange eignet sich sehr gut zum Verhindern Überkauft und überverkauft Um die erweiterten Funktionen der Nachrichtenwarteschlange zu realisieren, müssen Sie professionelle Nachrichtenwarteschlangen-Tools wie (rabbitmq) verwenden. Benutzer Redis Es gibt immer noch einige Mängel in der Benutzer-Redis-Implementierung der Nachrichtenwarteschlange um es selbst zu ergänzen. Ich werde sie hier nicht einzeln auflisten. Das größte Problem ist nach wie vor das Thema verteilter Cluster.

Redis Optimistic Lock implementiert die Flash-Killing-Funktion

Ihre Vorteile sind wie folgt:

Die Nachrichtenwarteschlange verbraucht viel Speicher, der 10.000 Anfragen erfordert 10.000 Vorgänge. Es kann leicht dazu führen, dass die Speicherressourcen sofort überlastet werden

Anhand der Logik des optimistischen Sperrens ist der CPU-Verbrauch relativ gering und die Speicherressourcen klein

    $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;
        }
    }

Für weitere Redis-Kenntnisse bitte Beachten Sie die Spalte Redis-Einführungs-Tutorial.

Das obige ist der detaillierte Inhalt vonRedis-Flash-Sale-Szenariolösung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen