この記事では、Redisでフラッシュセールを実現する方法(コード付き)を紹介します。参考価値はあります。困っている友人は参考にしてください。お役に立てれば幸いです。
はじめに: フラッシュセールについては誰もが知っているはずです。アクセスリクエストは短期間に急増します。同時に、売られすぎていないこと、データが正確であることを確認する必要があります。まだ技術的な課題がいくつかあります。残念ながら、これをプロジェクトに実装する機会はありませんでした。さらに詳しい情報を読んだ後、実験してみるつもりです。以下のコードはテスト用であり、比較的単純な環境ですので、実際の状況に応じて修正してください。
フラッシュ セール キューの作成
フラッシュ セールを開始する前に、まず次のように商品をキューに入れます
/** * 创建秒杀列表 */ public function createList() { $count = 30; $redisKey = 'goods_list'; for ($i = 1; $i = $count) { break; } Redis::rpush($redisKey, $i); } }
実行後、商品を表示します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())
値が同じでも同じデータは生成されません、こちらを参考にしてください。
最後のステップはテストです。ab test を使用し、ab -c 300 -n 3000 http://localhost/buy/
の意味を実行します。上記のコマンド 同時実行数は 300、リクエストの合計は 3000 です。
buy_success の値
は正確な数ではありません。2165 30 は成功したリクエストの数です。失敗したリクエスト 794 を追加すると、合計は 2989 となり、これは次のようになります。まだ3000未満です。
結論上記のテストには、応答速度の遅さ、リクエストの失敗、失敗数の不正確さなどの欠点があります。コード層だけでなく、最適化する箇所はたくさんあるようです。テスト中にデータベースへのアクセス記録をオフにするのを忘れてしまい、影響が出ている可能性があります。良い点は、フラッシュセールの成功数が正確であり、過剰に売られていないことです。 [関連する推奨事項:
Redis チュートリアル ]
以上がRedisのフラッシュセール実装方法の紹介(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。