[PHP]分散ロックのRedisに基づく高同時再送要求を防ぎます

要件:
(ベンダー外部チャネルシステム、業務システムB、C系)の検証システム列子を得てみよう
(1)チャネル・ビジネス・システムコールシステムB、着信携帯電話ことを確認し、IDカード、三つの要素の名前かどうか一貫性のあります。
(2)チャネルシステムは、外部ベンダCシステムを呼び出します。
(3)チャネルBのシステムは、ビジネス・システムへ結果を返します。
この3つの工程、(2)プロセスは、外部のベンダー課金を呼び出す必要があります。
システムは同じ3つの要素のチェックサム100ペンで、非常に高い同時実行性B事業であるとき、それは同じ3つの要素であるため、チャネルは結果だけを知っているベンダーを呼び出します。リクエストに同じ時間応答を防ぐためにハンドルをロックする必要性に、この時間を終了していないが、他の要求は、外部システムを呼び出すために

分散ロックの特性
原子:同時に、ロックマシンを得るための唯一のスレッド、
リエントラント(例えばスレッド、クラスなど)は、同じオブジェクトがデッドロックすることなくロックが発生し、再帰的に繰り返すことができる。
ブロック可能:前に、ロックを取得していないだけでロックされるまで待機してブロックすることができます。
高可用性:プログラム障害は、マシンが損傷している場合でも発生し、ロックがまだ解放されるように、取得するために取得することができます;
高性能:取得、小さな消費を操作ロックを解除します。

達成するために:ロック、カットロックを、ロック・タイムアウトの
実装が可能:mcのRedisのデータベースシステムファイルの飼育係

応答の結果の後に、別のキーを挿入し、ロックを解除するので、私は今、同じサービス要求100は、私の最初の要求最初のロック上を通過するチャネルシステム、午前、その後、外部ベンダーのシステムを要求します。
ロックがなくなっている場合は、ホイールを待って見つけることにラッチされている場合は、ロックを取得するために行くために他の要求は、結果を照会するために直接アクセスしてください。
最初の要求が失敗した場合、その結果は、所定の位置に挿入ロックを取得し、システムの外に見に行くしていきませんでした。

:ロックの取得
:$ redis-> SET( 'ロックIDカード&電話番号&名'、1、[ 'NX' ; 'EX' => 10])
:ロックを解除し
、直接キーを削除することである
ロック・タイムアウトを:
のロックをキータイムアウトがあります

Redisのsetコマンドの新しいバージョンが達成分散ロックを同時に設定し、2つのタイムアウトする時間がない場合にのみ達成することができますすることができます。

<?PHP
 $のRedis = 新新Redisの();
 $のRedis - > [接続( "127.0.0.1"、6379 );
 // 高同時繰り返し要求防ぐ

オーバーキー//チャネルシステムの伝送
$ lockKey = 'ロック:18806767777&37781991111629092&taoshihan' ;
 $ resultKey = 'のRES:18806767777&37781991111629092&taoshihan' ; 

// すでに照会値は、直接返すことができる場合
の情報$ = $のRedis - > GET($ resultKey );
 IF$インフォ){
     出口$インフォ); 
} 

// もしロックの取得する値がない
$ロック = $ Redisの > SETは、( -lockKey $、1、[ 'NX'、 'EX' => 10。]);
 IF$ロック){
     // このような応答が遅く生じ、結果を得るために、外部システムに要求
    睡眠(8。);
     $情報 =「{「名前":" taoshihan「} ' ;
     $ RET = $のRedis - > SET($ resultKey$情報);
     IF$のRET ){
         // ロック外し
        $ Redisのを - >デル($ lockKey );
         出口$情報)。
    } 
} 
エコー「後ほど再度お試しください!」;

 

おすすめ

転載: www.cnblogs.com/taoshihan/p/11711098.html