redis實現web頁面快取
阿新 • • 發佈:2019-02-11
1、網頁快取
在動態生成網頁的時候通常會使用模板語言來簡化網頁的生成操作,現在的web網頁通常由頭部、尾部、側欄選單、工具條、內容域的模板生成,有時候模板還用於生成javascript,但是對於一些不經常發生變化的頁面,並不需每次訪問都動態生成,對這些頁面進行快取,可以減少伺服器的壓力
快取思路
在處理請求之前新增一箇中間件,由這個中介軟體來呼叫redis快取函式,對於不能快取的頁面,函式直接生成頁面並返回;而能夠快取的頁面,函式首先從redis快取中去取出並返回快取頁面,如果快取頁面不存在則生成並快取到redis資料庫中5分鐘
php邏輯程式碼
public function cache_request(){
if (!$is_cache){
//生成快取頁面並返回
return $this->template->bulde($view);
}
$page_key = 'cache:'.$view;
$content = $this->redis->get($page_key);
if(!$content){
$content = $this->template->bulde($view);
$this->redis->settx($page_key,$content,300);
}
return $content;
}
2、資料行快取
通過網頁快取快取已經大大的提高了網頁載入的速度,而對於那些無法快取的頁面程式也可以通過資料行快取來提高他們的載入速度
實現思路
編寫一個持續執行的守護程序函式,讓這個函式將指定資料行快取到redis裡面,並不定期對資料行快取進行更新,資料行內容為json資料格式的字元。建立兩個有序集合來記錄何時對資料行進行更新。
一個為排程有序集合,成員為資料行ID,分值為當前時間戳
另一個為延時有序集合,成員為資料行ID,分值則記錄延時多久快取一次
將需要快取的資料行加入到延時有序集合和排程有序集合,分值初始值為延時時間,當前時間戳。
守護程序函式從排程有序集合中取出第一行資料行ID,進行資料行快取,快取完畢,更新排程有序集合資料行ID的分值為當前時間戳+延時時間
php邏輯程式碼
排程函式:schedule_row_cache
public function schedule_row_cache($row_id , $delay){
$this->redis->zadd('delay:',$row_id,$delay);
$this->redis->zadd('schedule:'.$row_id,time());
}
守護程序函式:cache_row
public function cache_row(){
while(true){
$next = $this->redis->zrange('schedule:',0,0,withscores=TRUE);
$now = time();
if(!$next){
continue;
}
$row_id = $next[0][0];
$delay = $this->redis->zscore('delay:',$row_id);
if($delay <= 0){
$this->redis->zrem('schedule:',$row_id);
$this->redis->zrem('delay:',$row_id);
$this->redis->delete('cache_row:'.$row_id);
}
//這裡Inventory的功能是獲取資料行,返回的是json字串
$row = Inventory.get($row_id);
$this->redis->zadd('schedule:',($row_id,$now+$delay));
$this->redis->set('cache_row:'.$row_id,$row);
}
}