yii2.0--緩存

配置:

'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 memcachememcached 擴展。 這個選項被看作分佈式應用環境中(例如:多臺服務器,有負載均衡等) 最快的緩存方案。
  • 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('緩存名稱');//取

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章