PHP Webサイトのredisキャッシュ手法の解析
作者: Wucl
時間: 2014-02-05
章の内容: 基本的な背景、分析内容、個人的な経験 (この人は非常に不道徳で、思いついたことを何でも書きます)。
ページのアクセス速度を向上させ、データベースへのアクセスの負荷を軽減するため。
最初に 3 つの質問をしてください:
1) Web サイト全体のミドルウェアはデータをキャッシュしますか?
2) Redis がミドルウェア データ全体をキャッシュする場合、Redis はその圧力に耐えることができますか?
3) PHP キャッシュ Redis はミドルウェアのキャッシュ方法に影響を与えますか?
現在 2 つのプランがあります:
プラン A: キャッシュ時間が短くなり、通常 120 秒以内になります。
プラン B: キャッシュ時間が長くなり、通常は 84600 秒になります。
プランA
開発の観点: キャッシュ操作は比較的頻繁に行われますが、ミドルウェア部分に負荷がかかる可能性があります。
編集の観点: データの編集後、効果が確認されるまでに最大 2 ~ 3 分かかるため、キャッシュをクリアする必要はありません。
ユーザーの観点: 10 分間の期間が使用されると仮定すると、この期間中のページ読み込みパフォーマンスは速い場合もあれば遅い場合もあります。
プランB
開発の観点: キャッシュは頻度が低いため、ミドルウェアに対する負荷の大部分を占める可能性があるため、この方法を使用することをお勧めします。
編集観点: 編集後、特定の操作を通じて以前のキャッシュをクリアする必要があります。
ユーザーの観点: ページの読み込み速度は安定していて速いです。
既存のプロジェクトに関連付けられたキャッシュ:
1) Redis が接続を確立します (長い接続を使用します):
pconnect: クラスの静的変数
プライベート静的関数 getRedisObject($ip = '127.0.0.1', $port = '6379'){
試してください{
if(isset(static::$pconnect['redis'.$ip.$port])){
$redis = static::$pconnect['redis'.$ip.$port];
}その他{
$redis = 新しい Redis();
$redis->pconnect($ip,$port);
$redis->select(1);
static::$pconnect['redis'] = $redis;
}
試してください{
$redis->ping();
}catch(RedisException $e){
$redis->pconnect($ip,$port);
$redis->select(1);
static::$pconnect['redis'] = $redis;
}
}catch(RedisException $e){
echo $e->getMessage().'
';
}
$redis を返す;
}
2) 主に3つの方法を適用します:
$conn->削除 ( $key )
$conn->get($key)
$conn->setex ( $key, $expire, $data )
3) 例外 RedisException に注意してください
4) マスターとスレーブの同期には 1 つの操作のみが必要です:
redis.conf のslaveofを次のように変更します:
127.0.0.1 6379のスレーブ
5) マスター Redis は追加と変更に使用でき、スレーブ Redis はクエリに使用できます。リンクブロックはスリープすることで解決します。実際のプロジェクトのリンク方法は以下の通りです(パラメータについては詳しく説明しません):
プライベート関数redisConn(){
if(!empty(static::$memInstance['redis'] ) && static::$memInstance['redis']instanceof Redis) {
$cacheConn = static::$memInstance['redis'];
試してください{
$cacheConn->ping(); // リンクに例外がない場合は、リンク インスタンスを返します
$cacheConn を返す;
}catch(RedisException $e){}
}
$cacheConn = null;
$tryI = 0;
while ( $cacheConn == null && $tryI
試してください{
$cacheConn = 新しい Redis ();
$serverSetting = Config::$redis;
if (! $cacheConn->pconnect ( $serverSetting[$this->_serverType]['ip'], $serverSetting[$this->_serverType]['port'])) {
$this->_serverType = "デフォルト";
$cacheConn->pconnect ( $serverSetting[$this->_serverType]['ip'], $serverSetting[$this->_serverType]['port']);
}
$cacheConn->setOption ( Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE );
// DBを選択します
$redisDB = $serverSetting[$this->_serverType]['redisDb'];
if ($redisDB > 0 && $redisDB
$cacheConn->select ( $redisDB );
} 他 {
$cacheConn->select ( 0 );
}
} catch (例外 $e) {
睡眠 ( $tryI * 0.3 );
$tryI++;
$cacheConn = null;
}
}
static::$memInstance['redis'] = $cacheConn;
$cacheConn を返す;
}
)