Laravelフレームワークによるredisクラスタの実装方法の解析
3699 ワード
この例では、Laravelフレームワークがredisクラスタを実装する方法について説明します.皆さんの参考にしてください.具体的には以下の通りです.
app/config/database.phpでは、次のように構成されています.
ここでclusterはtrueとして選択され、次にクラスタとして使用できます.
セッションのdriverをredisに設定すると、クラスタ機能を使用できます.
コードにこう書くとsessionの実装を見てみましょう.
実際の実行プロセスは次のとおりです.
セッションは戻りに基づいてdriverを作成します
すなわち、プロファイルで構成されています.ここではredisとして構成されています.
最終的にIlluminateSessionStoreがputの呼び出しを担当する
Storeクラスが格納するクラスはIlluminateSessionCacheBasedSessionHandlerです
後者はまた
クラスタに設定すると、createAggregateClientメソッドが呼び出されます.
ここではすべてのサーバをdefaultグループに配置します
実際にデータを保存するクラスはPredisClientで、ここには構成によってサーバーを作成するコードがあり、具体的には自分で見ることができます.
PredisClusterPredisClusterHashStrategyクラスはkeyのhashを計算し、キー関数:
getHash
getKeyFromFirstArgument
PredisClusterDistributionHashRingはサーバリングのメンテナンスを担当し、キー関数
addNodeToRing
get
hash
次のredisコマンドを実行すると
OKをcrc 32演算してhash値を取得します
すべてのサーバは、デフォルトで128の長さの配列に一定のアルゴリズムで配置され、各サーバはいくつかの項目を占め、以下によって決定されます.
ウェイト/合計ウェイト*合計サーバ数*128、
各項目のhash値は、crc 32としてサーバip:ポートのフォーマットで計算されます.
keyのhash値もあり、サーバループも計算され、残りは検索され、二分法で対応するサーバノードをより速く検索することができます.
Laravelに関する詳細については、「Laravelフレームワーク入門と進級チュートリアル」、「php優秀開発フレームワーク総括」、「phpオブジェクト向けプログラム設計入門チュートリアル」、「php+mysqlデータベース操作入門チュートリアル」、「php常見データベース操作テクニック要約」のトピックを参照してください.
Laravelフレームワークに基づくPHPプログラムの設計に役立つことを期待します.
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プログラムの設計に役立つことを期待します.