這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)PHP中怎么將redis作為緩存,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

10年的龍南網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整龍南建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“龍南網(wǎng)站設(shè)計”,“龍南網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
高效PHP Redis緩存技術(shù),可參考下步驟
是否想過PHP使用redis作為緩存時,如何能:
● 前后臺模塊共用Model層;
● 但是,不能每個Model類都進行緩存,這樣太浪費Redis資源;
● 前后臺模塊可以自由決定從數(shù)據(jù)庫還是從緩存讀數(shù)據(jù);
● 沒有冗余代碼;
● 使用方便。
● 這里我們先展示實現(xiàn)的最終效果。
最終的代碼和使用說明請移步Github:
https://github.com/yeszao/php-redis-cache。
馬上安裝使用命令:
$ composer install yeszao/cache
經(jīng)過簡單配置就可以使用,請參看Github的README說明。
1 最終效果
假設(shè)在MVC框架中,model層有一個Book類和一個getById方法,如下:
class Book
{
public function getById($id)
{
return $id;
}
}加入緩存技術(shù)之后,原來方法的調(diào)用方式和返回的數(shù)據(jù)結(jié)構(gòu)都不應(yīng)該改變。
所以,我們希望,最后的效果應(yīng)該是這樣的:
(new Book)->getById(100); // 原始的、不用緩存的調(diào)用方式,還是原來的方式,一般是讀取數(shù)據(jù)庫的數(shù)據(jù)。 (new Book)->getByIdCache(100); // 使用緩存的調(diào)用方式,緩存鍵名為:app_models_book:getbyid: + md5(參數(shù)列表) (new Book)->getByIdClear(100); // 刪除這個緩存 (new Book)->getByIdFlush(); // 刪除 getById() 方法對應(yīng)的所有緩存,即刪除 app_models_book:getbyid:*。這個方法不需要參數(shù)。
這樣我們可以很清楚的明白自己在做什么,同時又知道數(shù)據(jù)的來源函數(shù),并且被引用方式完全統(tǒng)一,可謂一箭三雕。
其實實現(xiàn)起來也比較簡單,就是使用PHP的魔術(shù)方法__call()方法。
2 __call()方法
這里簡單說明一下__call方法的作用。
在PHP中,當我們訪問一個不存在的類方法時,就會調(diào)用這個類的__call()方法。
(如果類方法不存在,又沒有寫__call()方法,PHP會直接報錯)
假設(shè)我們有一個Book類:
class Book
{
public function __call($name, $arguments)
{
echo '類Book不存在方法', $name, PHP_EOL;
}
public function getById($id)
{
echo '我的ID是', $id, PHP_EOL;
}
}當調(diào)用存在的getById(50)方法時,程序打印:我的ID是50。
而如果調(diào)用不存在的getAge()方法時,程序就會執(zhí)行到A類的__call()方法里面,這里會打印:類Book不存在方法getAge。
這就是__call的原理。
3 實現(xiàn)細節(jié)
接下來我們就利用__call()方法的這種特性,來實現(xiàn)緩存策略。
從上面的例子,我們看到,__call()方法被調(diào)用時,會傳入兩個參數(shù)。
name:想要調(diào)用的方法名arguments:參數(shù)列表
我們就可以在參數(shù)上面做文章。
還是以Book類為例,我們假設(shè)其原本結(jié)構(gòu)如下:
class Book
{
public function __call($name, $arguments)
{
// 待填充內(nèi)容
}
public function getById($id)
{
return ['id' => $id, 'title' => 'PHP緩存技術(shù)' . $id];
}
}開始之前,我們還確認Redis的連接,這是緩存必須用到的,這里我們寫個簡單的單例類:
class Common
{
private static $redis = null;
public static function redis()
{
if (self::$redis === null) {
self::$redis = new \Redis('127.0.0.1');
self::$redis->connect('redis');
}
return self::$redis;
}然后,我們開始填充__call()方法代碼,具體說明請看注釋:
class Book
{
public function __call($name, $arguments)
{
// 因為我們主要是根據(jù)方法名的后綴決定具體操作,
// 所以如果傳入的 $name 長度小于5,可以直接報錯
if (strlen($name) < 5) {
exit('Method does not exist.');
}
// 接著,我們截取 $name,獲取原方法和要執(zhí)行的動作,
// 是cache、clear還是flush,這里我們?nèi)×藗€巧,動作
// 的名稱都是5個字符,這樣截取就非常高效。
$method = substr($name, 0, -5);
$action = substr($name, -5);
// 當前調(diào)用的類名稱,包括命名空間的名稱
$class = get_class();
// 生成緩存鍵名,$arguments稍后再加上
$key = sprintf('%s:%s:', str_replace('\\', '_', $class), $method);
// 都用小寫好看點
$key = strtolower($key);
switch ($action) {
case 'Cache':
// 緩存鍵名加上$arguments
$key = $key . md5(json_encode($arguments));
// 從Redis中讀取數(shù)據(jù)
$data = Common::redis()->get($key);
// 如果Redis中有數(shù)據(jù)
if ($data !== false) {
$decodeData = json_decode($data, JSON_UNESCAPED_UNICODE);
// 如果不是JSON格式的數(shù)據(jù),直接返回,否則返回json解析后的數(shù)據(jù)
return $decodeData === null ? $data : $decodeData;
}
// 如果Redis中沒有數(shù)據(jù)則繼續(xù)往下執(zhí)行
// 如果原方法不存在
if (method_exists($this, $method) === false) {
exit('Method does not exist.');
}
// 調(diào)用原方法獲取數(shù)據(jù)
$data = call_user_func_array([$this, $method], $arguments);
// 保存數(shù)據(jù)到Redis中以便下次使用
Common::redis()->set($key, json_encode($data), 3600);
// 結(jié)束執(zhí)行并返回數(shù)據(jù)
return $data;
break;
case 'Clear':
// 緩存鍵名加上$arguments
$key = $key . md5(json_encode($arguments));
return Common::redis()->del($key);
break;
case 'Flush':
$key = $key . '*';
// 獲取所有符合 $class:$method:* 規(guī)則的緩存鍵名
$keys = Common::redis()->keys($key);
return Common::redis()->del($keys);
break;
default:
exit('Method does not exist.');
}
}
// 其他方法
}這樣就實現(xiàn)了我們開始時的效果。
4 實際使用時
在實際使用中,我們需要做一些改變,把這一段代碼歸入一個類中,
然后在model層的基類中引用這個類,再傳入Redis句柄、類對象、方法名和參數(shù),
這樣可以降低代碼的耦合,使用起來也更靈活。
上述就是小編為大家分享的PHP中怎么將redis作為緩存了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享文章:PHP中怎么將redis作為緩存
路徑分享:http://www.chinadenli.net/article6/iehpig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、域名注冊、定制開發(fā)、Google、網(wǎng)站營銷、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)