>  기사  >  데이터 베이스  >  Redis의 플래시 세일 구현 방법 소개(코드 포함)

Redis의 플래시 세일 구현 방법 소개(코드 포함)

不言
不言앞으로
2019-04-12 09:44:245872검색

이 글은 Redis(코드 포함)에서 플래시 세일을 구현하는 방법을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

소개: 플래시 세일에 대해 모두가 알아야 할 사항입니다. 단기간 내에 액세스 요청이 급증할 것입니다. 동시에 데이터가 과매도되지 않았는지, 아직 기술적인 부분이 있는지 확인해야 합니다. 도전. 안타깝게도 프로젝트에서 이를 구현할 기회가 없었습니다. 좀 더 많은 정보를 읽은 후 실험해 볼 계획입니다. 다음 코드는 테스트용이며 환경이 비교적 간단하므로 실제 상황에 따라 수정하십시오.

플래시 세일 대기열을 생성합니다

플래시 세일을 시작하기 전에 먼저 다음과 같이 제품을 대기열에 넣습니다

/**
     * 创建秒杀列表
     */
    public function createList()
    {
        $count = 30;
        $redisKey = 'goods_list';

        for ($i = 1; $i = $count) {
                break;
            }

            Redis::rpush($redisKey, $i);
        }
    }

실행 후 Redis에서 확인합니다

Redis의 플래시 세일 구현 방법 소개(코드 포함)제품 ID가 30개이며 데이터는 정상입니다. .

즉시 판매

다음 단계는 Redis의 lpop 명령을 사용하여 Redis의 원자성을 활용하여 제품 ID를 얻는 핵심 단계입니다. lpop 命令获取商品 ID,利用的是 Redis 的原子性。

/**
     * 秒杀
     */
    public function buy()
    {
        // 随机用户名,无意义,仅做标记
        $username = Hash::make(now());

        if ($goodsId = Redis::lpop('goods_list')) {
            // 购买成功
            Redis::hset('buy_success', $goodsId, $username);
        } else {
            // 购买失败
            Redis::incr('buy_fail');
        }
    }

如上,简化了代码,购买之后,成功与否只是做记录。实际应用中,当然会更加复杂,但要注意的是,不要同步操作 Mysql。多说一句,Hash:make(now()) 即使值相同,也不会生成相同的数据,参考这里。

测试

最后就是进行测试了,使用 ab 测试,执行 ab -c 300 -n 3000 http://localhost/buy/ ,上述命令的意思是 300 并发,共请求 3000 次

Redis의 플래시 세일 구현 방법 소개(코드 포함)

执行完成,速度并不快,并且还有 794 个访问失败。来看下数据是否正确吧。在页面中打印 buy_successrrreee

위와 같이 코드가 단순화되어 구매 후 성공 여부는 기록에 불과합니다. 실제 애플리케이션에서는 물론 더 복잡해지겠지만, MySQL을 동기적으로 동작시키지 않도록 주의해야 한다. 한 가지 더, Hash:make(now())는 값이 동일하더라도 동일한 데이터를 생성하지 않습니다. 여기를 참고하세요.

Redis의 플래시 세일 구현 방법 소개(코드 포함)Test

마지막 단계는 테스트하고, ab test를 사용하고, ab -c 300 -n 3000 http://localhost/buy/를 실행하는 것입니다. 위 명령은 300개의 동시성을 의미하며 총 요청 3000개 시간

Redis의 플래시 세일 구현 방법 소개(코드 포함) Redis의 플래시 세일 구현 방법 소개(코드 포함)

실행이 완료되었는데 속도가 그리 빠르지는 않고 여전히 794건의 접속실패가 발생하고 있습니다. 데이터가 맞는지 확인해 보겠습니다. 페이지에 buy_success


30명의 당첨자를 인쇄하세요. 실패한 플래시 판매 횟수를 살펴보겠습니다

정확한 숫자는 아닙니다. 2165+30은 실패한 요청 794개를 더하면 총 2989개로 여전히 3000개보다 적습니다.

🎜결론🎜🎜위 테스트에는 느린 응답 속도, 실패한 요청, 부정확한 실패 횟수 등의 단점이 있습니다. 코드 레이어뿐만 아니라 최적화할 곳이 많은 것 같습니다. 테스트 중에 데이터베이스에 대한 액세스 기록을 끄는 것을 잊어버렸는데, 이로 인해 약간의 영향이 있을 수 있습니다. 🎜좋은 점은 플래시 판매 성공 횟수가 정확하고 과매도가 아니라는 점입니다. [관련 권장 사항: 🎜Redis 튜토리얼🎜]🎜🎜🎜

위 내용은 Redis의 플래시 세일 구현 방법 소개(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제