それはRedisのクラスタよりも大きい場合(単一のRedisことを条件とする)、分散ロックのRedisの実装に基づいて、非同期例外があってもよいです。
アイデアの実現:
setnxのRedisの使用(キー、値):「セットでない場合は終了する」、キー値が存在しない場合は、成功したキャッシュに入社し、キャッシュ時間を再設定し、1を返し、それ以外の場合は0を返します。
ここではより多くのキャッシュ時間よりも、システムが自動的にキャッシュを解放します。
成功した場合は、時間を制限する権利の効果的な実施に入る、それが失敗する許可を取得できませんでした。
次のサンプルコードを貼り付け。
参照NServiceKit.Redis NuGetを追加することで、コンソールプログラムを作成します。そして、過去に以下のコードをコピーします。あなたは例を実行することができます。
使用してシステムを。 使用してSystem.Collections.Genericを。 使用してSystem.Linqのを。 使用してSystem.Textのを。 使用してSystem.Threadingを。 使用してSystem.Threading.Tasksを。 名前空間RedisCheckTest { 使用して NServiceKit.Redisを; // NuGetでRedisのライブラリを追加し たクラスのプログラム { 静的な 無効メイン(文字列[] argsを) { VaRの M = 0 。 一方、(M < 1000000 ) { M ++ ; /// シミュレーション要求を繰り返し3回送信される ため(VAR J = 1。 ; J <= 3 ; J ++ ) { CreateOrderApi(J)。 } // (VAR 1 = I。; I <= 3; Iは++)用 // { // シミュレーション要求が繰り返し送信される三回 // スレッドT2 =新しい新しいスレッド(CreateOrderApi); // t2.Start(); // } スレッド.sleep(8000 )。 } Console.ReadLine(); } /// <まとめ> /// 例では、この方法は、注文を作成すること、である /// </要約> /// <PARAM NAME = "言及ID上記"> </ PARAM> /// <戻りA> </戻りA> プライベート 静的 無効 CreateOrderApi(int型REQUEST_ID) { ストリング parmaterid = 「P2は」 ; // これはリクエストIDパラメータのAPIであると仮定する VaRの nxkey = " CNX " + parmaterid。 VaRの値= parmaterid。 BOOL setnx = SetNX(nxkey、値)。 もし(!setnx) { Console.WriteLineを(" RequestID:" + request_id.ToString()+ " " + " あまりにも頻繁に要求、10秒後、再試行してください。" ); リターン; } // TODO:書き込み受注ここでロジック Console.WriteLineを(" RequestID:" + request_id.ToString()+ " " + " 成功" ); } constの 文字列のホスト= 「127.0.0.1 」。 const int型ポート= 6379 ; パブリック 静的 ブール SetNX(文字列 cachekey、文字列値、int型 secondsTimeout = 5 ) { 文字列 NamespacePrefix = " api01_ " 。 文字列のキー= NamespacePrefix + cachekey。 使用して(VARのクライアント= 新しいRedisClient(ホスト、ポート)) { た変更= System.Text.Encoding.UTF8.GetBytes(値)。 たもたらし= client.SetNX(キー、変更); だっ setnxは=(結果== 1)?真:偽; client.Set(キー、値、DateTime.Now.AddSeconds(secondsTimeout)); // バッファ5秒間キー リターンSETNX。 } } } }