分散ロックとしてのRedis

使用分散ロック・サービス・ロジックとしての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 { GETSET ;} 

        パブリック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();
        } 
    } 
}

 

次のように動作した結果は以下のとおりです。

 

おすすめ

転載: www.cnblogs.com/1175429393wljblog/p/12310417.html