ホームページ バックエンド開発 PHPチュートリアル 同時実行性の高い在庫のブロックを解決し、過剰在庫、フラッシュセール、不動産の強奪、宝くじなどを制御するための PHP のアイデアと方法。

同時実行性の高い在庫のブロックを解決し、過剰在庫、フラッシュセール、不動産の強奪、宝くじなどを制御するための PHP のアイデアと方法。

Jul 29, 2016 am 09:13 AM
flock lock product quot

現在、電子商取引業界では、フラッシュセールラッシュ購入活動が販売業者の一般的なプロモーション方法となっています。しかし、在庫数には限りがあるので、同時に注文する人が在庫数を超えてしまうと、売れすぎてしまったり、場合によっては在庫がマイナスになってしまうこともあります。 別の例: 電車のチケットの購入ラッシュ、フォーラムでの不動産の購入ラッシュ、宝くじ、さらには Weibo の人気のコメントも、ブロッキングの同時実行性の問題を引き起こす可能性があります。何も対策を講じないと、あっという間にサーバーが麻痺してしまう可能性があります。
より実現可能だと思うアイデアをいくつか紹介します:

オプション 1: メッセージ
queue を使用して実装する
は MemcacheQ などのメッセージ
queue に基づいて行うことができます。具体的な実装計画は表現してみましょうたとえば、ユーザーが取得できるチケットが 100 枚ある場合、ユーザーはこれら 100 枚のチケットをキャッシュに置き、読み取りおよび書き込み時にロックしないことができます。 同時実行の量が多い場合、約 500 人がチケットを取得できる可能性があるため、500 人以降のリクエストはイベントの終了時に静的ページに直接転送されます。 500人中400人が商品を手に入れることは不可能です。したがって、
キューに入った順に従って、最初の100名のみが正常に購入できます。次の 400 名はイベント終了ページに直接移動します。もちろん、500 人と入力するのは単なる例です。その数は自分で調整できます。アクティビティ終了ページでは、データベースではなく静的ページを使用する必要があります。これにより、データベースへの負担が軽減されます。
オプション 2: 複数のサーバーがある場合、オフロードの形で実装できます

m 個のチケットがあり、n 台の製品サーバーがリクエストを受信し、x 個のリクエストがルーティング サーバーによってランダムに転送されると仮定します
m/n 個のチケットを各製品サーバーに直接割り当てます
各製品サーバーのメモリに
カウンター を作成し、たとえば m/n*(1+0.1) 人の入場を許可します。 メモリ
カウンターがいっぱいの場合: 後から入る人はイベントが終了する静的ページに直接ジャンプし、
このサーバーにルーティングされなくなることをルーティングサーバーに通知します(これは議論する価値がある)。
すべての製品サーバーから入ってくる m/n*(1+0.1) 人が支払いサーバーに転送され、誰がより早いかを確認するために支払いプロセスに入ります。現時点では人数が少ないため、ロックか何かが簡単です。

オプション 3. 単一サーバーの場合は、Memcache ロックを使用して実装できます

product_key はチケット キーです
product_lock_key はチケット ロック キーです
product_key が memcached に存在する場合、すべてのユーザー注文手続きに入ることができます。
支払い手続きに入るときは、まずadd(product_lock_key, “1”)をmemcachedに格納し、
返品に成功したら支払い手続きに入ります。
失敗した場合は、誰かがすでに支払いプロセスに入っていることを意味し、スレッドは N 秒間待機して追加操作を再帰的に実行します。

オプション 4: ファイル排他ロックを使用する

注文リクエストを処理するときに、flock を使用してファイルをロックします。ロックが失敗した場合は、現時点では他の注文が処理中であることを意味します。または、ユーザーに直接「サーバーがビジーです」とプロンプトを表示します。 -ブロッキングモード:
<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
//..处理订单
flock($fp,LOCK_UN);
}
fclose($fp);
?>
ログイン後にコピー

上記では、行列、フラッシュセール、人数、カウンターなど、パニック買い、フラッシュセール、財産の強奪、宝くじなどの同時実行性の高い在庫の防止と制御をブロックする問題を解決するための PHP のアイデアと方法を紹介します。 PHP チュートリアルに興味のある友人が助けてくれることを願っています。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

JavaマルチスレッドでLockを使用する方法 JavaマルチスレッドでLockを使用する方法 May 12, 2023 pm 02:46 PM

Jdk1.5 以降では、java.util.concurrent.locks パッケージの下に、スレッド同期用のインターフェイスとクラスのセットが存在します。スレッド同期に関して言えば、組み込みキーワードである synchronized キーワードを誰もが思い浮かべるかもしれません。 Java ではスレッドの同期を処理しますが、このキーワードには多くの欠陥があり、利便性や直感的に使用することが難しいため、Lock が表示されます。通常、synchronized キーワードを使用すると、次の問題が発生します。 (1) 制御不能、自由にロックしたりロックを解放したりできない。 (2) 効率は比較的低く、たとえば、現在 2 つのファイルを同時に読み取っています。

Linux でのファイル ロック コマンド: flock、fcntl、lockfile、flockfile 詳細なチュートリアル! Linux でのファイル ロック コマンド: flock、fcntl、lockfile、flockfile 詳細なチュートリアル! Feb 23, 2024 pm 09:01 PM

Linux では、flock、fcntl、lockfile、flockfile など、一般的に使用されるファイル ロック コマンドがいくつかあります。これらのコマンドは、マルチプロセスまたはマルチスレッド環境でファイルへの相互排他的アクセスを提供するために使用されます。これらのコマンドの詳細なチュートリアルは次のとおりです。 flock コマンド: flock コマンドをシェル スクリプトで使用して、ファイルの排他的ロックを実行できます。ファイルをロックするには、次の構文を使用します。 flock [options] filename コマンド たとえば、file.txt という名前のファイルをロックしてコマンドを実行するには、次のコマンドを実行します。 flockfile.txtls - lflock コマンドは、実行中にファイルをロックします。ロックはコマンドの実行完了後に自動的に解除されます。 fcnt

JavaでLockを使用するにはどのような方法がありますか? JavaでLockを使用するにはどのような方法がありますか? Apr 23, 2023 pm 08:52 PM

1. 機能 (1) ロックを取得する Lock メソッドは、割り込みをサポートし、タイムアウト後の取得なし、ノンブロッキング (2) セマンティクスを改善します。どこでロックおよびロックを解除するかを書き出す必要があります (3) ロックの明示的なロックにより、次のことが可能になります。優れた柔軟性を備えていますが、同時にロックを手動で解放する必要があります (4) サポート条件条件オブジェクト (5) 複数の読み取りスレッドが同時に共有リソースにアクセスできるようにします 2. ロックの使用法 // ロックを取得 voidlock() //現在のスレッドがロックを取得していない場合、中断された場合、ロックを取得します voidlockInterruptibly()//この Lock インスタンスにバインドされた新しい Condition インスタンスを返します ConditionnewCondition()//呼び出されたときのみロックします

Java Lock クラスはどのような機能を提供しますか? Java Lock クラスはどのような機能を提供しますか? Apr 21, 2023 am 08:16 AM

注1. Lockはjava.util.concurentパッケージ配下のインタフェースであり、一連のロック操作メソッドを定義しています。 2. Lock インターフェイスには、主に ReentrantLock、ReentrantReadWriteLock、ReentrantReadWriteLock、および WriteLock 実装クラスが含まれます。 Synchronized とは異なり、Lock はロックの取得やロックの解放などの関連インターフェイスを提供するため、より柔軟に使用でき、より複雑な操作が可能になります。 InstanceReentrantReadWriteLocklock=newReentrantReadWriteLock();Lockread

SpringBoot は開発環境と製品環境を切り替えるために複数の構成ファイルをどのようにロードしますか? SpringBoot は開発環境と製品環境を切り替えるために複数の構成ファイルをどのようにロードしますか? May 12, 2023 pm 11:58 PM

1. マルチ環境切り替えは SpringBoot に実装されています。SpringBoot では、application.properties に加えて、作成する他の設定ファイルのファイル名が application-{profile}.properties の形式を満たす必要があります。ここで、{profile} は環境識別子 (必ずしも .properties ファイルまたは .yml であるとは限りません) とそれに対応する {profile} 値は開発者 (dev、product など) によってカスタマイズされます。プロジェクトの開始時に、対応するパラメーターを追加するだけで済みます。 Springboot がそれを読み取ります。プロファイルを作成します。特定のプロファイル構成

Java では、synchronized キーワードを使用するだけでなく、Lock を提供する必要があるのはなぜですか? Java では、synchronized キーワードを使用するだけでなく、Lock を提供する必要があるのはなぜですか? Apr 20, 2023 pm 05:01 PM

概要: synchronized キーワードは、1 つのスレッドのみが同期されたコード ブロックにアクセスできるようにするために Java で提供されています。 synchronized キーワードが提供されているのに、なぜ Lock インターフェースも Java SDK パッケージで提供されるのですか?これは不必要な車輪の再発明でしょうか?今日はこの問題について一緒に話し合います。 Java では synchronized キーワードが提供され、1 つのスレッドのみが同期されたコード ブロックにアクセスできるようにします。 synchronized キーワードが提供されているのに、なぜ Lock インターフェースも Java SDK パッケージで提供されるのですか?これは不必要な車輪の再発明でしょうか?今日は一緒にそれについて話し合いましょう

Javaでロックを取得するにはどのような方法がありますか? Javaでロックを取得するにはどのような方法がありますか? May 19, 2023 pm 01:13 PM

1. ロックの取得には、取得メソッド lock()、tryLock()、tryLock(longtime、TimeUnitunit)、および lockInterruptibly() がすべて使用されます。 (1) lock() メソッドは最も一般的に使用されるメソッドであり、ロックを取得するために使用されます。ロックが別のスレッドによって取得されている場合は、待機します。 (2) tryLock() メソッドには戻り値があり、ロックの取得を試行するために使用され、取得に成功した場合は true を返し、取得に失敗した場合 (つまり、ロックが他のユーザーによって取得された場合) を返します。 thread) の場合、false が返されます。これは、メソッドが何があってもすぐに返されることを意味します。ロックができないときにそこで待つ必要はありません。 (3) トライロック

See all articles