使用分散ロック・サービス・ロジックとしてのRedis
...
...
単にケースを使用して、以下のように(コモディティスパイクシナリオ)は次のとおりです。
次のシナリオを前提商品のスパイクケースはRedisのが既にインストールされていることを実証し、そして使用することができ、特定のインストールチュートリアルでは、記事に、この記事を参照することができ Redisの概要とインストール
1、コンソールプロジェクトのConsoleTestRedisを作成し、右の項目を選択し、NuGetパッケージマネージャをクリックし、検索して追加するにはVisual Studioの2019 Enterpriseを使用してStackExchange.Redisを
2、クライアントのクライアント要求クラス、商品スパイクProductKill、Redisのクラス分散ロック・RedisLockを追加
クライアントクライアントの要求クラスのコードは次のよう:
使用してSystem.Threadingを。 名前空間ConsoleTestRedis { /// <要約> /// 客户端请求 /// </要約> パブリック クラスクライアント { 公共 ボイドCleitRequest() { ProductKill productKill = 新しいProductKill()。 以下のために(INT iが= 0 ; I < 20 ; I ++ ) { 新しいスレッド(()=> {productKill.KillProduct();})を起動()。 } } } }
次のようにProductKillスパイク商品コードは次のようになります。
使用してシステムを。 使用してSystem.Collections.Genericを。 使用してSystem.Linqのを。 使用してSystem.Textのを。 使用してSystem.Threadingを。 使用してSystem.Threading.Tasksを。 名前空間ConsoleTestRedis { /// <要約> /// 商品秒杀 /// </要約> パブリック クラスProductKill { /// <要約> /// 库存数量 /// </要約> 公共 INT repositoryNumber = 10 。 /// <要約> /// 获取库存的数量 /// </要約> /// <戻り値> </戻り> 公共 INT GetRepositoryNumber() { 戻りrepositoryNumberを; } /// <まとめ> /// 控除ストック番号 /// </要約> 公共 ボイドSetRepositoryNumber () { repositoryNumber - ;; } /// <まとめ> /// 商品スパイク /// </要約> 公共 ボイドKillProduct() { // 分散ロックRedisLock Redisのを使用して RedisLock = RedisLock 新しい新RedisLock(); redisLock.Lock(); VAR restory = GetRepositoryNumber(); IFは(restory == 0 ) { Console.WriteLineを($ " {}申し訳ありませんが取得失敗は、商品の在庫数をThread.CurrentThread.ManagedThreadId! :repositoryNumber {} " ); redisLock.UnLock(); 戻り値; } Console.WriteLineを($ " おめでとうございます{} Thread.CurrentThread.ManagedThreadId GETスパイク商品の成功数量在庫:! repositoryNumber {} " ); } SetRepositoryNumber(); redisLock.UnLock(); } }
次のようにRedisのは、ロックRedisLockクラスコードを配布さ:
使用してシステムを。 使用してSystem.Collections.Genericを。 使用してSystem.Linqのを。 使用してSystem.Textのを。 使用してSystem.Threadingを。 使用してSystem.Threading.Tasksを。 使用してStackExchange.Redisを。 名前空間ConsoleTestRedis { /// <要約> /// Redisの分布式锁 /// </要約> パブリック クラスRedisLock { /// <要約> /// Redisの分布式连接管理器 /// </要約> 公衆 ConnectionMultiplexer _connectionMultiplexer { 取得します。SET ;} /// <まとめ> /// データベース /// </要約> 公共するIDatabase _database { GET、SET ;} パブリックRedisLock() { // 前提を使用してRedisのAPIは、インストールが2、NuGetパッケージ管理のRedis追加StackExchange.Redis _connectionMultiplexer = ConnectionMultiplexer.Connect(" ローカルホスト:6379 " ); _database = _connectionMultiplexer.GetDatabase(0 ); } /// <まとめ> /// ロック /// </要約> 公衆 ボイドロック() { ながら(真の) { // LockTakeパラメータ(ロック名、取得されたオブジェクトの有効期限をもたらす) BOOL isLocked = _database.LockTake(" redis_key "、Thread.CurrentThread.ManagedThreadId、TimeSpan.FromSeconds(200です)) ; IF (isLocked) { BREAK ; } のThread.sleep(200で); } } /// <まとめ> /// リリースさ /// </要約> 公共 ボイドUNLOCK() { // LockReleaseパラメータ(ロック名得られたオブジェクトを取得) _database.LockRelease(" redis_key " 、Thread.CurrentThread.ManagedThreadId); _connectionMultiplexer.Close(); } } }
Program.csの
使用してシステムを。 使用してSystem.Collections.Genericを。 使用してSystem.Linqのを。 使用してSystem.Textのを。 使用してSystem.Threadingを。 使用してSystem.Threading.Tasksを。 名前空間ConsoleTestRedis { クラスプログラム { 静的な 無効メイン(文字列[] argsを) { Console.WriteLineを(" .....商品秒杀开始...... " ); クライアントクライアント = 新しいクライアント(); client.CleitRequest(); Console.ReadKey(); } } }
次のように動作した結果は以下のとおりです。