PHP網站redis緩衝方式分析
PHP網站redis緩衝方式分析
作者:Wucl
時間:2014-02-05
章節內容:基礎背景、分析內容、個人心得(這個人非常沒品德,想到什麼就寫什麼。)。
1. 基礎背景:
為了提高頁面訪問速度,降低訪問資料庫壓力。
2. Redis緩衝分析:
首先提出3個問題:
1)是否緩衝整個網站中介軟體的資料?
2)如果緩衝整個中介軟體的資料redis是否可以承壓?
3)PHP緩衝redis是否會對中介軟體的緩衝方式存在影響?
現有兩種預案:
A方案:緩衝時間較短,一般為120s以內,
B方案:緩衝時間較長,一般為84600s。
A方案
開發角度:快取作業比較頻繁,但可以分擔中介軟體部分的壓力。
編輯角度:編輯資料後至多2-3分鐘看到效果,因此可以不用通過操作清除緩衝。
使用者角度:假設以10分鐘為一個時間段,那麼在這個時間段裡面頁面載入表現為時快時慢。
B方案
開發角度:緩衝不頻繁,可以分擔中介軟體很大部分的壓力,建議用這個方式。
編輯角度:編輯後必須通過特定的操作清除以前的緩衝。
使用者角度:頁面載入速度穩定且較快。
緩衝與現有項目關聯:
1) Redis建立串連(使用長串連):
pconnect: 類的靜態變數
private static function getRedisObject($ip = '127.0.0.1', $port = '6379'){
try{
if(isset(static::$pconnect['redis'.$ip.$port])){
$redis = static::$pconnect['redis'.$ip.$port];
}else{
$redis = new Redis();
$redis->pconnect($ip,$port);
$redis->select(1);
static::$pconnect['redis'] = $redis;
}
try{
$redis->ping();
}catch(\RedisException $e){
$redis->pconnect($ip,$port);
$redis->select(1);
static::$pconnect['redis'] = $redis;
}
}catch(\RedisException $e){
echo $e->getMessage().'
';
}
return $redis;
}
2) 主要應用3個method:
$conn->delete ( $key )
$conn->get($key)
$conn->setex ( $key, $expire, $data )
3) 注意異常RedisException
4) 主從同步只要做一個操作:
從redis.conf修改slaveof類似為:
slaveof 127.0.0.1 6379
5) 可以master redis做添加、修改,slave redis做查詢。連結阻塞以sleep解決,下列是實際項目的連結方式(參數不多做解釋):
private function redisConn(){
if(!empty(static::$memInstance['redis'] ) && static::$memInstance['redis'] instanceof Redis) {
$cacheConn = static::$memInstance['redis'];
try{
$cacheConn->ping(); //連結未出異常,則返回連結執行個體
return $cacheConn;
}catch(\RedisException $e){}
}
$cacheConn = null;
$tryI = 0;
while ( $cacheConn == null && $tryI < 10 ) {
try {
$cacheConn = new Redis ();
$serverSetting = Config::$redis;
if (! $cacheConn->pconnect ( $serverSetting[$this->_serverType]['ip'], $serverSetting[$this->_serverType]['port'])) {
$this->_serverType = "default";
$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 <= 16) {
$cacheConn->select ( $redisDB );
} else {
$cacheConn->select ( 0 );
}
} catch ( \Exception $e ) {
sleep ( $tryI * 0.3 );
$tryI ++;
$cacheConn = null;
}
}
static::$memInstance['redis'] = $cacheConn;
return $cacheConn;
}
http://www.bkjia.com/PHPjc/962644.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/962644.htmlTechArticlePHP網站redis緩衝方式分析 PHP網站redis緩衝方式分析 作者:Wucl 時間:2014-02-05 章節內容:基礎背景、分析內容、個人心得(這個人非常沒品德...