Laravelフレームワークによるredisクラスタの実装方法の解析

3699 ワード

この例では、Laravelフレームワークがredisクラスタを実装する方法について説明します.皆さんの参考にしてください.具体的には以下の通りです.
app/config/database.phpでは、次のように構成されています.

'redis' => array(
    'cluster' => true,
    'default' => array(
      'host'   => '172.21.107.247',
      'port'   => 6379,
    ),
   'redis1' => array(
      'host'   => '172.21.107.248',
      'port'   => 6379,
    ),


ここでclusterはtrueとして選択され、次にクラスタとして使用できます.
セッションのdriverをredisに設定すると、クラスタ機能を使用できます.
コードにこう書くとsessionの実装を見てみましょう.

Session::put('test', 124);


実際の実行プロセスは次のとおりです.

Illuminate\Support\Facades\Session
Illuminate\Support\Facades\Facade
Illuminate\Session\Facade::app['session']->put
Illuminate\Session\Facade::app['session'] Illuminate\Session\SessionManager
Illuminate\Support\Manager::__call


セッションは戻りに基づいてdriverを作成します

$this->app['config']['session.driver']


すなわち、プロファイルで構成されています.ここではredisとして構成されています.

Illuminate\Session\SessionManager::Illuminate\Session\SessionManager


最終的にIlluminateSessionStoreがputの呼び出しを担当する
Storeクラスが格納するクラスはIlluminateSessionCacheBasedSessionHandlerです
後者はまた$this->app['cache']->driver($driver)
に要求を転送する......一連のコード追跡を経て、ストレージクラスはPredisClientDatabaseであり、その構築関数を見る:

public function __construct(array $servers = array())
{
    if (isset($servers['cluster']) && $servers['cluster'])
    {
      $this->clients = $this->createAggregateClient($servers);
    }
    else
    {
      $this->clients = $this->createSingleClients($servers);
    }
}


クラスタに設定すると、createAggregateClientメソッドが呼び出されます.

protected function createAggregateClient(array $servers)
{
    $servers = array_except($servers, array('cluster'));
    return array('default' => new Client(array_values($servers)));
}


ここではすべてのサーバをdefaultグループに配置します
実際にデータを保存するクラスはPredisClientで、ここには構成によってサーバーを作成するコードがあり、具体的には自分で見ることができます.
PredisClusterPredisClusterHashStrategyクラスはkeyのhashを計算し、キー関数:
getHash
getKeyFromFirstArgument
PredisClusterDistributionHashRingはサーバリングのメンテナンスを担当し、キー関数
addNodeToRing
get
hash
次のredisコマンドを実行するとget ok
OKをcrc 32演算してhash値を取得します
すべてのサーバは、デフォルトで128の長さの配列に一定のアルゴリズムで配置され、各サーバはいくつかの項目を占め、以下によって決定されます.
ウェイト/合計ウェイト*合計サーバ数*128、Predis\Cluster\Distribution\HashRing::addNodeToRingメソッド参照
各項目のhash値は、crc 32としてサーバip:ポートのフォーマットで計算されます.

protected function addNodeToRing(&$ring, $node, $totalNodes, $replicas, $weightRatio)
{
    $nodeObject = $node['object'];
    $nodeHash = $this->getNodeHash($nodeObject);
    $replicas = (int) round($weightRatio * $totalNodes * $replicas);
    for ($i = 0; $i < $replicas; $i++) {
      $key = crc32("$nodeHash:$i");
      $ring[$key] = $nodeObject;
    }
}


keyのhash値もあり、サーバループも計算され、残りは検索され、二分法で対応するサーバノードをより速く検索することができます.
Laravelに関する詳細については、「Laravelフレームワーク入門と進級チュートリアル」、「php優秀開発フレームワーク総括」、「phpオブジェクト向けプログラム設計入門チュートリアル」、「php+mysqlデータベース操作入門チュートリアル」、「php常見データベース操作テクニック要約」のトピックを参照してください.
Laravelフレームワークに基づくPHPプログラムの設計に役立つことを期待します.