찾다
데이터 베이스RedisRedis 연결 목록을 사용하여 동시성이 높은 제품 과매출 문제를 해결하는 방법

구현 원칙

redis 연결 목록을 사용하여 수행하세요. 팝 작업은 원자적이므로 많은 사용자가 동시에 도착하더라도 순서대로 실행되므로 권장됩니다.

구현 단계

첫 번째 단계는 제품 인벤토리를 대기열에 넣는 것입니다

/**
 * 添加商品数量到商品队列
 * @param int $couponId 优惠券ID
 */
function addCoupons($couponId)
{
    //1.初始化Redis连接
    $redis = new Redis();
    if (!$redis->connect('127.0.0.1', 6379)) {
        trigger_error('Redis连接出错!!!', E_USER_ERROR);
    } else {
        echo &#39;连接正常<br>&#39;;
    }

    //根据优惠券ID从数据库中查询该优惠券的库存量
    //$sql = "select id, stock from coupon where id = {$couponId}";
    $stock = 10; //假设10就是我们从数据库中查询出的该优惠券在数据库中的库存量

    //我们现在将这10个库存放入到以该商品ID为key的redis链表中,有几件库存,就存入多少次1,链表长度代表商品库存数
    for($i = 0; $i < $stock; $i++) {
        $redis->lPush("secKill:".$couponId.":stock", 1);
    }

    $redis->close();
}
$couponId = 11211;
addCoupons($couponId);

이 메서드를 호출한 다음 redis를 확인하면 10개의 요소가 연결 목록에 추가되었습니다

Redis 연결 목록을 사용하여 동시성이 높은 제품 과매출 문제를 해결하는 방법

두 번째 단계는 다음과 같습니다. 러시 시작 및 인벤토리 설정 캐싱 기간

이 단계는 귀하의 비즈니스에 따라 결정됩니다. 비즈니스에서 사용자가 얻을 수 있도록 2분 동안 쿠폰을 공개한다고 규정한 경우 다음을 통해 링크된 목록에 대한 유효 기간을 설정하십시오. expire() 방법은 유효기간 내에 획득하지 못하더라도 사용자가 재고를 획득할 수 없습니다. (저희 회사에서는 쿠폰 획득 유효기간을 설정하지 않기 때문에 굳이 할 필요는 없습니다.) 이 단계를 수행하세요)

//设置链表有效期是两分钟
$redis->expire(&#39;key&#39;, 120);

세 번째 단계에서는 클라이언트가 즉시 스냅업 작업을 수행합니다

/**
 * 抢优惠券(秒杀)
 * @param int $couponId 商品ID
 * @param int $uid 用户ID
 * @return bool
 */
function secKill($couponId, $uid)
{
    //1.初始化Redis连接
    $redis = new Redis();
    if (!$redis->connect(&#39;127.0.0.1&#39;, 6379)) {
        trigger_error(&#39;Redis连接出错!!!&#39;, E_USER_ERROR);
    } else {
        echo &#39;连接正常<br>&#39;;
    }

    //将已经成功抢购的用户添加到该以该商品ID为key的集合(set)中
    //如果用户已经在集合中,说明用户已经成功秒杀过一次了,不允许再次参与秒杀
    if ($redis->sIsMember(&#39;secKill:&#39;.$couponId.&#39;:uid&#39;, $uid)) {
        echo &#39;秒杀失败&#39;;
        return false;
    }

    //秒杀商品的库存key
    $key = &#39;secKill:&#39;.$couponId.&#39;:stock&#39;;

    //从以该优惠券ID为key的链表中弹出一个值,如果有值,证明优惠券还有库存
    $isSockNotEmpty = $redis->lPop($key);

    //判断库存,如果库存大于0,则减库存,将该成功秒杀用户加入哈希表,如果小于等于0,秒杀结束
    if ($isSockNotEmpty != 1) {
        echo &#39;秒杀已结束&#39;;
        return false;
    }

    //抢券成功,将优惠券ID和UID放入到队列中,由一个单独的进程队列来消费队列里的数据,向用户推送抢到的优惠券
    $redis->lPush(&#39;couponOrder&#39;, $couponId.&#39;+&#39;.$uid);

    //将成功抢券的用户记录到集合中,防止被已抢过的用户再次秒杀
    $redis->sAdd(&#39;secKill:&#39;.$couponId.&#39;:uid&#39;, $uid);
    $redis->close();
    return true;
}

$couponId = 11211;
$uid      = mt_rand(1, 100);
secKill($couponId, $uid);

네 번째 단계는 성공입니다. 플래시 판매 사용자는 동시성이 크지 않은 구매의 경우 영구 데이터를 데이터베이스에 입력합니다. , 세 번째 단계에서 성공적인 구매 후 정보를 데이터베이스에 직접 쓸 수 있습니다. 동시성이 상대적으로 많은 경우에는 RabbitMQ 메시지 큐에 넣어 소비할 수 있습니다. 대신 RabbitMQ 큐를 사용하는 것이 좋습니다. redis는 RabbitMQ가 메시지를 100% 소비하도록 보장할 수 있는 반면 redis는 상대적으로 안정성과 신뢰성이 떨어집니다.)

//此处代码省略
//根据自己的业务场景看看是入数据库还是放入rabbitMQ消息队列中消费

이제 ab 도구를 사용하여 높은 동시성(요청 2000개, 동시성 100개)에서 쿠폰 가져오기 동작을 시뮬레이션합니다

ab -n 2000 -c 100 www.test.com/

그런 다음 Redis Desktop Manager를 사용하여 Redis 결과를 봅니다

마찬가지로 쿠폰 주문 대기열에는 이미 사용자 uid와 쿠폰 ID를 포함하는 10개의 정보가 있으며 대기열에서 사용할 수 있습니다.

Redis 연결 목록을 사용하여 동시성이 높은 제품 과매출 문제를 해결하는 방법

동시에 사용자 10명의 UID 정보도 사용자 쿠폰 컬렉션에 저장됩니다.

Redis 연결 목록을 사용하여 동시성이 높은 제품 과매출 문제를 해결하는 방법

위 내용은 Redis 연결 목록을 사용하여 동시성이 높은 제품 과매출 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 亿速云에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
Redis 카운터 사용 방법Redis 카운터 사용 방법Apr 10, 2025 pm 07:00 PM

Redis 카운터는 카운터를 저장 및 운영하기위한 데이터 구조를 제공합니다. 특정 단계에는 다음이 포함됩니다. 카운터 생성 : ext 명령을 사용하여 기존 키에 1을 추가하십시오. 카운터 값 가져 오기 : get 명령을 사용하여 현재 값을 얻으십시오. 증분 카운터 : incrby 명령을 사용하고 그 뒤에 금액이 증가합니다. 감소 카운터 : DET 또는 DECBY 명령을 사용하여 1만큼 감소하거나 금액을 지정하십시오. 카운터 재설정 : 세트 명령을 사용하여 값을 0으로 설정하십시오. 또한 카운터를 사용하여 요금, 세션 추적 및 투표 시스템을 생성 할 수 있습니다.

Redis 연결 수를 수정하는 방법Redis 연결 수를 수정하는 방법Apr 10, 2025 pm 06:57 PM

구성 파일에서 MaxClients 매개 변수를 수정하여 Redis 연결 수를 수정할 수 있습니다. 특정 단계에는 다음이 포함됩니다. 구성 파일 위치 : 일반적으로 /etc/redis/redis.conf에 위치하여 MaxClients 매개 변수를 찾으려면 매개 변수 값을 수정하십시오. 필요한 연결 수로 설정하여 Redis 서비스를 저장하고 다시 시작하려면 Redis 명령을 다시 시작하여 Redis를 다시 시작합니다.

Redis-Server를 찾을 수없는 경우해야 할 일Redis-Server를 찾을 수없는 경우해야 할 일Apr 10, 2025 pm 06:54 PM

Redis-Server가 찾을 수없는 문제를 해결하기위한 단계 : Redis가 올바르게 설치되어 있는지 확인하십시오. 환경 변수를 설정 redis_host 및 redis_port; Redis Server Redis-Server를 시작하십시오. 서버가 Redis-Cli Ping을 실행 중인지 확인하십시오.

Redis와 함께 세션을 저장하는 방법Redis와 함께 세션을 저장하는 방법Apr 10, 2025 pm 06:51 PM

Redis를 사용하여 세션을 저장하는 두 가지 방법이 있습니다. Redis를 세션 스토리지로 사용하여 해시 테이블을 작성하여 사용자 세션 데이터를 저장하고 사용자 ID 또는 세션 ID를 키로 저장하고 키 값 쌍을 사용합니다. 다른 스토리지에 세션 데이터를 저장하기 위해 세션 지속성 백엔드로 Redis를 사용하고 Read 성능을 향상시키기 위해 Redis와 정기적으로 동기화하십시오.

Redis로 높은 동시성을 해결하는 방법Redis로 높은 동시성을 해결하는 방법Apr 10, 2025 pm 06:48 PM

Redis는 주로 다음 메커니즘으로 인해 높은 동시성 문제를 효율적으로 해결합니다. 1) 메모리 저장, 매우 빠른 읽기 및 쓰기; 2) 단일 스레드 이벤트 루프, 잠금없는 경쟁; 3) 다중 연결을 동시에 듣는다. 4) 데이터 구조를 최적화하고 신속하게 찾아서 삽입 및 삭제합니다. 5) 복제 및 클러스터링,로드 밸런싱 및 결함 공차; 6) 데이터 보안을 보장하기위한 지속성.

Redis Storage 데이터를 보는 방법Redis Storage 데이터를 보는 방법Apr 10, 2025 pm 06:45 PM

Redis에 저장된 데이터를 두 가지 방법으로 볼 수 있습니다. Redis 명령 줄 인터페이스 (CLI)를 사용하여 get & lt; key & gt; 명령. Redis Desktop Manager 또는 Redis Commander와 같은 GI (Giv) 도구를 사용하여 우호적 인 사용자 인터페이스 및 운영 기능을 제공하십시오.

Redis가 성공적으로 시작하는지 확인하는 방법Redis가 성공적으로 시작하는지 확인하는 방법Apr 10, 2025 pm 06:42 PM

Redis가 성공적으로 시작되었는지 확인하는 방법 : 터미널 명령을 통해 프로세스 상태를 확인하십시오 : Linux/UNIX : PS -EF | grep redis : ps aux | grep redis는 redis 클라이언트 도구와 ping을 통해 연결됩니다 : redis-cli ping access redis 웹 인터페이스 : http : // [redis instance ip] : 6379/info

Redis 지연 큐를 구현하는 방법Redis 지연 큐를 구현하는 방법Apr 10, 2025 pm 06:39 PM

Redis Delay 큐의 구현은 순서 세트를 사용하고 작업을 점수 (타임 스탬프)로 저장하고 정기적으로 만료 된 작업을 검색하고 삭제 및 실행합니다. 단계는 다음과 같습니다. 순서 컬렉션을 만들고 Delayed_Queue를 작성하고 작업을 분수 (타임 스탬프)로 저장하십시오. 0과 현재 타임 스탬프 사이의 점수로 만료 된 작업을 검색하십시오. 만료 된 작업을 삭제합니다. 만료 된 작업을 수행하십시오.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는