1. 程式人生 > >Yii2中使用基於redis的快取

Yii2中使用基於redis的快取

背景知識:

  1. 快取顧名思義就是將資料儲存起來,下次要使用時直接獲取即可。程式中用的最多的就是將資料庫的資料進行快取從而減少查詢資料庫的次數,減輕伺服器壓力。
  2. yii2框架預設使用的是檔案快取,本文將介紹redis快取的使用,因此需要安裝yii的redis擴充套件,傳送門

1.首先進行配置,使我們的專案以redis作為快取:

  [
      'components' => [
          'cache' => [
              'class' => 'yii\redis\Cache',
              'redis' => [
                  'hostname' => 'localhost',
                  'port' => 6379,
                  'database' => 0,
              ]
          ],
      ],
  ]

2.首先介紹一種常見的快取方式:先判斷在redis中對應key有沒有值,如果存在就返回,如果不存在就從資料庫中查詢得到結果,並將結果快取並返回。


//例項程式碼:先判斷redis中是否存在key為cates的值,如果存在就直接使用
//如果不存在,就從資料庫中查詢得到結果並存入快取
if(!$cates=\Yii::$app->cache->get('cates')){
    $cates = $category->getCategorys();
     \Yii::$app->cache->set('cates',$cates,\Yii::$app->params['redis_cache_expire']);
}
 \Yii::$app->view->params['cates']=$cates;


//這裡需要注意:當資料量比較少時,通過yii的debug工具你會發現使用了快取之後,系統執行的時間並沒有
//減少多少或者時間更長了,這僅僅是因為資料量少的原因,當資料量多的時候,快取的優勢才會很明顯

3.其次介紹快取依賴,首先我們要明確快取依賴是什麼?快取依賴是除了快取的有效時間之外另一個決定快取是否有效的因素,yii2框架支援的快取依賴有哪些呢?點我檢視,本文主要講解db依賴的使用方法:


//使用快取依賴的小例子
if(!$cart=\Yii::$app->cache->get('cart')){
    $cart = $query->limit($pager->limit)->offset($pager->offset)->all();
    $dp=new \yii\caching\DbDependency([
        'sql'=>'select max(update_time) from {{%cart}} where uid=:uid',
        'params'=>[':uid'=>\Yii::$app->session['user']['uid']]
    ]);
    \Yii::$app->cache->set('cart',$cart,\Yii::$app->params['redis_cache_expire'],$dp);
}

//當sql查詢出來的update_time的最大值發生變化時,即時有效期沒有過,快取也失效。如果update_time的最大值沒有
//發生變化,那麼快取有效期過了就失效

4.最後介紹查詢快取的使用,查詢快取簡單地理解就是以當前查詢的sql語句為key快取查詢結果:


#查詢快取的小例子
$goods=Goods::getDb()->cache(function(){
        return Goods::find()->where(['status'=>1,'is_hot'=>1])->all();
},2*60*60,$dep);


#引數dep的值是當前查詢快取的依賴
#2*60*60是當前查詢快取的有效期,如果不填寫,則有效期為資料庫連線類的成員屬性$queryCacheDuration的值

#關於資料庫連線類yii\db\Connection的幾個成員屬性的介紹,因為它們的值直接關係到查詢快取:
#public $enableQueryCache = true;  是否啟用查詢快取,預設是true
#public $queryCacheDuration = 3600; 如何不指定快取的有效期,那麼預設是3600秒
#public $queryCache = 'cache';  查詢快取所使用的快取元件,基於本文的設定,快取最終會存在redis中
#以上值都可以在db.php配置檔案中進行個性化配置

以上就是基於redis為快取的簡單使用