ホームページ  >  記事  >  データベース  >  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のフラッシュセール実装方法の紹介(コード付き) の下に 30 個のプロダクト ID があり、データは正常です。

フラッシュ セール

次のステップでは、Redis のアトミック性を利用して、Redis の lpop コマンドを使用して製品 ID を取得します。

/**
     * 秒杀
     */
    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()) 値が同じでも同じデータは生成されません、こちらを参考にしてください。

Test

最後のステップはテストです。ab test を使用し、ab -c 300 -n 3000 http://localhost/buy/ の意味を実行します。上記のコマンド 同時実行数は 300、リクエストの合計は 3000 です。

Redisのフラッシュセール実装方法の紹介(コード付き)

# 実行は完了しましたが、速度は速くなく、アクセス失敗は 794 回あります。データが正しいかどうか見てみましょう。

buy_success の値

Redisのフラッシュセール実装方法の紹介(コード付き)

30 人の当選者をページに印刷します。失敗したフラッシュ セールの数を見てみましょう。

は正確な数ではありません。2165 30 は成功したリクエストの数です。失敗したリクエスト 794 を追加すると、合計は 2989 となり、これは次のようになります。まだ3000未満です。 Redisのフラッシュセール実装方法の紹介(コード付き)

結論

上記のテストには、応答速度の遅さ、リクエストの失敗、失敗数の不正確さなどの欠点があります。コード層だけでなく、最適化する箇所はたくさんあるようです。テスト中にデータベースへのアクセス記録をオフにするのを忘れてしまい、影響が出ている可能性があります。

良い点は、フラッシュセールの成功数が正確であり、過剰に売られていないことです。 [関連する推奨事項:
Redis チュートリアル ]

以上がRedisのフラッシュセール実装方法の紹介(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。