程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP網站redis緩存方式分析

PHP網站redis緩存方式分析

編輯:關於PHP編程

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;

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved