PHP網站redis緩存方式分析
作者:Wucl
時間:2014-02-05
章節內容:基礎背景、分析內容、個人心得(這個人非常沒品德,想到什麼就寫什麼。)。
為了提高頁面訪問速度,降低訪問數據庫壓力。
首先提出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;
}