>  기사  >  데이터 베이스  >  Redis 플래시 판매 시나리오 솔루션

Redis 플래시 판매 시나리오 솔루션

尚
앞으로
2020-05-25 09:02:272796검색

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 낙관적 잠금은 플래시 종료 기능을 구현합니다

장점은 다음과 같습니다.

메시지 대기열은 10,000개의 대기열 제거 작업이 필요한 많은 메모리를 소비합니다. 메모리 리소스가 즉시 폭발하기 쉽습니다

낙관적 잠금 논리를 사용하면 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으로 문의하시기 바랍니다. 삭제