===============================================
3分の2020 / 28_最初の編集 ccb_warlock
===============================================
最近、私は最適化の作業の枠組みを行うために多くの時間を持っている、その理由は、Redisの接続プールに懸念される異常箇所Redisの接続時の層をルーティング処理するフレームデータは、Redisのための接続プール機能して、最適化することができるからです私たちは、研究とテストを行いました。
まず、の値
1.1バリュー池
ここでの値は、プールのデザインでシンプルな言及は接続の特定の種類を繰り返し作成し、再利用のコストよりもはるかに大きなコストを作成する必要がある場合ということですが、このデザイン池の導入を最適化するように選択することが可能です。
一般に、プールの初期化時にプールのサイズを定義するために必要。
最初はプールがオブジェクトでないオブジェクトが(後に自動的に使用する場合、追跡を提供するオブジェクトを作成できません)、プールから取得する必要がある場合、オブジェクトがアップに使用されたときに、本当のリリースを行うが、オブジェクトを入れていません次のビジネスニーズを待つプールへのアクセスバック。
1.2 Redisの池の値
通常、C#プロジェクトでは、主にホイールStackExchange.Redis Redisの操作として使用され、後のStackExchange.Redis TCPコネクションは、一連の操作を作成することによって、それらをRedisの。
TCPによって、私たちはニーズをフォローアップするためにビジネスを3ウェイハンドシェイクの後に、サービスの同時実行は、池がより良い接続を作成するオーバーヘッドを減らすことができたときの順序で行われることを知っているので、結合効率を向上させます。
二、NuGetパッケージ
StackExchange.Redis.ConnectionPool
PS。現在のバージョンは1.0.1を使用することです
第三に、プロジェクトのRedis接続プールの導入
3.1前提条件
私は唯一の相関関数ベースのasp.netコア(2.2,3.1)プロジェクトをテストしました。
3.2の追加構成情報はRedisのあります
asp.netコアプロジェクトに従事することは、システムが依存性注入を経てプロジェクト計画における記録appsettings.jsonの設定項目および設定情報を提供していることに注意する必要があります。
次のようにAppsettings.jsonの仮定は、読み取ります。
{ " Redisの" :{ " ホスト":" ローカルホスト" 、 " ポート":6379 、 " パスワード":" 123456 " 、 " プールサイズ":20 } }
3.3定義された設定を受信エンティティの作成
パブリック クラスRedisConfig { 公共の 文字列のホスト{ GET。セット; } 公共の int型ポート{ 取得します。セット; } パブリック 文字列のパスワード{ 取得します。セット; } 公共 のintプールサイズ{ 得ます。セット; } }
依存性の注入は3.4接続プールを追加します
ここでの問題は、Startup.csに続くコードの構造を、考慮されていない、次の行を追加します。
パブリック クラス起動 { プライベート IConfiguration構成{ GET ;} 公共のスタートアップ(IConfiguration構成) { 設定 = 設定; } 公共IServiceProvider ConfigureServices(IServiceCollectionサービス) { // TODO // スレッドの実際のトラフィックの最小数に応じて設定さ ThreadPool.SetMinThreads(200は、200である); VAR redisConfig = Configuration.GetSection(" Redisの")に.get <RedisConfig> (); VARredisOptions = 新しいConfigurationOptions { エンドポイント = { {redisConfig.Host、redisConfig.Port} }、 パスワード = redisConfig.Password、 }。 services.AddRedisConnectionPool(redisOptions、redisConfig.PoolSize)。 // TODO } }
メソッドStackExchange.Redis.ConnectionPool呼び出しを設けることにより、物理的な接続プールのRedisのは、プロジェクト全体に注入しました。
第四に、接続プーリングのRedisの使用
Iフレームが移動する層をルーティング接続プールインターセプタデータを最適化しているので、これを行うために、実施例として記載されています。
パブリック クラスRouteInterceptor:BaseInterceptor { プライベート ObjectPool <PooledConnectionMultiplexer>プール{ GET。セット; } 公共 RouteInterceptor(ObjectPool <PooledConnectionMultiplexer> プール) { プール = プール。 } 保護 オーバーライド ボイドハンドラ(IInvocation呼び出し) { VARの DB = 1 。 // TODO(获取要操作的デシベル) PooledConnectionMultiplexerクライアント = nullを。 トライ { クライアント= Pool.GetObject()。 VAR clientDb = redis.GetDatabase(DB) // TODO } キャッチ(例外e) { // TODO } 試み { invocation.Proceed()。 } キャッチ(例外e) { // TODO } 最後に { クライアント?。廃棄(); } } }
Redisのは、彼らはそれにStackExchange.Redisを使用した方法に従って動作します。