配置:
'components' => [
'cache' => [
'class' => 'yii\caching\MemCache',
'servers' => [
[
'host' => 'server1',
'port' => 11211,
],
[
'host' => 'server2',
'port' => 11211,
],
],
'redis' => [
'hostname' => '127.0.0.1',
'port' => 6379,
'database' => 0,
]
],
],
緩存存儲器:
yii\caching\ApcCache:使用 PHP APC 擴展。 這個選項可以認爲是集中式應用程序環境中 (例如:單一服務器,沒有獨立的負載均衡器等)最快的緩存方案。
yii\caching\DbCache:使用一個數據庫的表存儲緩存數據。要使用這個緩存, 你必須創建一個與 yii\caching\DbCache::$cacheTable 對應的表。
爲了增強 ArrayCache 的性能,您可以通過將 yii\caching\ArrayCache::$serializer 設置爲 false 來禁用已存儲數據的序列化。
yii\caching\DummyCache:僅作爲一個緩存佔位符,不實現任何真正的緩存功能。 這個組件的目的是爲了簡化那些需要查詢緩存有效性的代碼。例如, 在開發中如果服務器沒有實際的緩存支持,用它配置一個緩存組件。 一個真正的緩存服務啓用後,可以再切換爲使用相應的緩存組件。 兩種條件下你都可以使用同樣的代碼 Yii::$app->cache->get($key) 嘗試從緩存中取回數據而不用擔心 Yii::$app->cache 可能是 null。
yii\caching\FileCache:使用標準文件存儲緩存數據。 這個特別適用於緩存大塊數據,例如一個整頁的內容。
yii\caching\MemCache:使用 PHP memcache 和 memcached 擴展。 這個選項被看作分佈式應用環境中(例如:多臺服務器,有負載均衡等) 最快的緩存方案。
yii\redis\Cache:實現了一個基於 Redis 鍵值對存儲器的緩存組件 (需要 redis 2.6.12 及以上版本的支持 )。
yii\caching\WinCache:使用 PHP WinCache (另可參考)擴展.
yii\caching\XCache:使用 PHP XCache擴展。
yii\caching\ZendDataCache:使用 [Zend Data Cache](http://files.zend.com/help/Zend-Server-6/zend- server.htm#data_cache_component.htm) 作爲底層緩存媒介。
所有緩存組件都有同樣的基類 yii\caching\Cache ,因此都支持如下 API:
- get():通過一個指定的鍵(key)從緩存中取回一項數據。 如果該項數據不存在於緩存中或者已經過期/失效,則返回值 false。
- set():將一個由鍵指定的數據項存放到緩存中。
- add():如果緩存中未找到該鍵,則將指定數據存放到緩存中。
- getOrSet():返回由鍵指定的緩存項,或者執行回調函數,把函數的返回值用鍵來關聯存儲到緩存中, 最後返回這個函數的返回值。
- multiGet():由指定的鍵獲取多個緩存數據項。
- multiSet():一次存儲多個數據項到緩存中,每個數據都由一個鍵來指明。
- multiAdd():一次存儲多個數據項到緩存中,每個數據都由一個鍵來指明。 如果某個鍵已經存在,則略過該數據項不緩存。
- exists():返回一個值,指明某個鍵是否存在於緩存中。
- delete():通過一個鍵,刪除緩存中對應的值。
- flush():刪除緩存中的所有數據。
數據緩存
數據緩存是指將一些 PHP 變量存儲到緩存中,使用時再從緩存中取回。 它也是更高級緩存特性的基礎,例如查詢緩存 和內容緩存。
如下代碼是一個典型的數據緩存使用模式。 其中 $cache
指向緩存組件:
// 嘗試從緩存中取回 $data
$data = $cache->get($key);
if ($data === false) {
// $data 在緩存中沒有找到,則重新計算它的值
// 將 $data 存放到緩存供下次使用
$cache->set($key, $data);
}
// 這兒 $data 可以使用了。
從 2.0.11 版本開始, 緩存組件 提供了 getOrSet() 方法來簡化數據的取回、計算和存儲。 下面的代碼邏輯和上一個例子是完全一樣的:
$data = $cache->getOrSet($key, function () {
return $this->calculateSomething();
});
當緩存中有關聯 $key 的數據時,將返回這個緩存的值。 否則就執行匿名函數來計算出將要緩存的數據並返回它。
如果匿名函數需要作用域外的數據時,可以使用 use
語句把這些數據傳遞到匿名函數中。 例如:
$user_id = 42;
$data = $cache->getOrSet($key, function () use ($user_id) {
return $this->calculateSomething($user_id);
});
注意: getOrSet() 方法也支持緩存持續性和緩存依賴。 請看緩存過期 和 緩存依賴 來了解詳細信息。
緩存組件
數據緩存需要緩存組件提供支持,它代表各種緩存存儲器, 例如內存,文件,數據庫。
緩存組件通常註冊爲應用程序組件,這樣它們就可以 在全局進行配置與訪問。如下代碼演示瞭如何配置應用程序組件 cache
使用兩個 memcached 服務器:
'components' => [
'cache' => [
'class' => 'yii\caching\MemCache',
'servers' => [
[
'host' => 'server1',
'port' => 11211,
'weight' => 100,
],
[
'host' => 'server2',
'port' => 11211,
'weight' => 50,
],
],
],
],
然後就可以通過 Yii::$app->cache
訪問上面的緩存組件了。
由於所有緩存組件都支持同樣的一系列 API ,並不需要修改使用緩存的業務代碼 就能直接替換爲其他底層緩存組件,只需在應用配置中重新配置一下就可以。 例如,你可以將上述配置修改爲使用 APC cache:
'components' => [
'cache' => [
'class' => 'yii\caching\ApcCache',
],
],
提示: 你可以註冊多個緩存組件,很多依賴緩存的類默認調用 名爲
cache
的組件(例如 yii\web\UrlManager)。
支持的緩存存儲器
Yii 支持一系列緩存存儲器,概況如下:
- yii\caching\ApcCache:使用 PHP APC 擴展。 這個選項可以認爲是集中式應用程序環境中 (例如:單一服務器,沒有獨立的負載均衡器等)最快的緩存方案。
- yii\caching\DbCache:使用一個數據庫的表存儲緩存數據。要使用這個緩存, 你必須創建一個與 yii\caching\DbCache::$cacheTable 對應的表。
-
爲了增強 ArrayCache 的性能,您可以通過將 yii\caching\ArrayCache::$serializer 設置爲
false
來禁用已存儲數據的序列化。 - yii\caching\DummyCache:僅作爲一個緩存佔位符,不實現任何真正的緩存功能。 這個組件的目的是爲了簡化那些需要查詢緩存有效性的代碼。例如, 在開發中如果服務器沒有實際的緩存支持,用它配置一個緩存組件。 一個真正的緩存服務啓用後,可以再切換爲使用相應的緩存組件。 兩種條件下你都可以使用同樣的代碼
Yii::$app->cache->get($key)
嘗試從緩存中取回數據而不用擔心Yii::$app->cache
可能是null
。 - yii\caching\FileCache:使用標準文件存儲緩存數據。 這個特別適用於緩存大塊數據,例如一個整頁的內容。
- yii\caching\MemCache:使用 PHP memcache 和 memcached 擴展。 這個選項被看作分佈式應用環境中(例如:多臺服務器,有負載均衡等) 最快的緩存方案。
- yii\redis\Cache:實現了一個基於 Redis 鍵值對存儲器的緩存組件 (需要 redis 2.6.12 及以上版本的支持 )。
- yii\caching\WinCache:使用 PHP WinCache (另可參考)擴展.
- yii\caching\XCache:使用 PHP XCache擴展。
- yii\caching\ZendDataCache:使用 [Zend Data Cache](http://files.zend.com/help/Zend-Server-6/zend- server.htm#data_cache_component.htm) 作爲底層緩存媒介。
提示: 你可以在同一個應用程序中使用不同的緩存存儲器。一個常見的策略是使用基於內存的緩存存儲器 存儲小而常用的數據(例如:統計數據),使用基於文件或數據庫的緩存存儲器 存儲大而不太常用的數據(例如:網頁內容)。
緩存 API
所有緩存組件都有同樣的基類 yii\caching\Cache ,因此都支持如下 API:
- get():通過一個指定的鍵(key)從緩存中取回一項數據。 如果該項數據不存在於緩存中或者已經過期/失效,則返回值 false。
- set():將一個由鍵指定的數據項存放到緩存中。
- add():如果緩存中未找到該鍵,則將指定數據存放到緩存中。
- getOrSet():返回由鍵指定的緩存項,或者執行回調函數,把函數的返回值用鍵來關聯存儲到緩存中, 最後返回這個函數的返回值。
- multiGet():由指定的鍵獲取多個緩存數據項。
- multiSet():一次存儲多個數據項到緩存中,每個數據都由一個鍵來指明。
- multiAdd():一次存儲多個數據項到緩存中,每個數據都由一個鍵來指明。 如果某個鍵已經存在,則略過該數據項不緩存。
- exists():返回一個值,指明某個鍵是否存在於緩存中。
- delete():通過一個鍵,刪除緩存中對應的值。
- flush():刪除緩存中的所有數據。
注意: 千萬別直接用
false
布爾值當做數據項緩存,因爲 get() 方法用false
作爲返回值來表明對應的緩存項不存在。 你可以把false
放到一個數組裏然後緩存這個數組來避免上述的混淆問題。
緩存過期
// 將數據在緩存中保留 45 秒
$cache->set($key, $data, 45);
sleep(50);
$data = $cache->get($key);
if ($data === false) {
// $data 已過期,或者在緩存中找不到
}
redis緩存使用
use yii\redis\Connection;
$cache = new Connection;
$cache = $cache->set('緩存名稱',要緩存的數據);//存
$cache = $cache->get('緩存名稱');//取