Yii2數據緩存詳解


數據緩存是指將一些 PHP 變量存儲到緩存中,使用時再從緩存中取回。 它也是更高級緩存特性的基礎,例如查詢緩存 和內容緩存。

緩存組件

數據緩存需要緩存組件提供支持,它代表各種緩存存儲器, 例如內存,文件,數據庫。

'components' => [ 'cache' => [ 'class' => 'yii\caching\FileCache', // 上面這種是Yii默認的緩存方式,標准文件緩存數據,當然也可以使用其他方式,如: // 'class' => 'yii\caching\MemCache', // 'class' => 'yii\caching\ApcCache', ], ]

 

支持的緩存方式
  • yii\caching\ApcCache:使用 PHP APC 擴展。這個選項可以 認為是集中式應用程序環境中(例如:單一服務器, 沒有獨立的負載均衡器等)最快的緩存方案。
  • yii\caching\DbCache:使用一個數據庫的表存儲緩存數據。要使用這個緩存,你必須 創建一個與 yii\caching\DbCache::cacheTable 對應的表。
  • 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 作為底層緩存媒介。

緩存的增刪改查示例

// 加載緩存組件 $cache = \Yii::$app->cache; // 添加一個緩存 $cache->add('name','zhangsan'); // 更改一個緩存 $cache->set('name' , 'lisi'); // 刪除一個緩存 $cache->delete('name'); // 獲取緩存內容 $cache->get('name') // 查看緩存是否存在 if($cache->exists('name')){ echo '存在'; } // 同時增加多個緩存 $cache->madd(['name' => 'zhangsan' , 'age' => 18]); // 同時獲取多個緩存 var_dump($cache->mget(['name' , 'age'])); // 清空緩存 $cache->flush();

設置緩存有效期

默認情況下,緩存中的數據會永久存留,除非它被某些緩存策略強制移除(例如: 緩存空間已滿,最老的數據會被移除)。要想改變此特性,可以使用 yii\caching\Cache::add()yii\caching\Cache::set() 的第三個參數來改變。

// 加載緩存組件 $cache = \Yii::$app->cache; // 默認該緩存在20秒之后過期 $cache->add('name','zhangsan',20); // 同樣 $cache->set('name','zhangsan',20);

緩存依賴

除了超時設置,緩存數據還可能受到緩存依賴的影響而失效。我們可以使用 yii\caching\Cache::add()yii\caching\Cache::set() 的第四個參數來設置。

// 加載組件 $cache = \Yii::$app->cache; // 文件依賴 $dependency = new \yii\caching\FileDependency(['fileName'=>'robots.txt']); // 如果 robots.txt 被修改,該緩存也立刻失效 $cache->add('the', 'hello world!', 3000, $dependency); $result = $cache->get('the'); // 表達式依賴 $dependency = new \yii\caching\ExpressionDependency( ['expression' => '\Yii::$app->request->get("name")'] ); // 這里使用的表達式是獲取$_GET['name']的值,如果值改變,該緩存失效 $cache->add('two', 'hello world!', 3000, $dependency); $result = $cache->get('two'); // 數據庫依賴 $dependency = new \yii\caching\DbDependency( ['sql' => 'SELECT count(*) FROM test.user'] ); // 當數據庫字段發生變化時,該緩存失效 $cache->add('three', 'hello world!', 3000, $dependency); $result = $cache->get('three');

 

舉個列子:
在一個數據比較龐大的訂單記錄中統計時間段內的成交金額,以及利潤,在這樣的查詢頁面會產生過多的加載時間,等待是痛苦的。我們可以將查詢的結果按時間段存儲到緩存中,訂單是變化的,統計的時間段一旦涉及今天,則統計需依賴訂單的最新創建時間,如創建時間變化,此時緩存失效,可重新生成緩存;反之,緩存不受影響;

/*訂單表(order) id uerid price type(訂單類型) state(1為已支付 0 未支付) paytime  createtime isdelete*/ 

#查詢成交金額 

function ordercheck($starttime,$endtime){   

    $cacheid = "order".$starttime.$endtime;   //設置緩存id     

    if( !Yii::app()->cache->get($cacheid) ){       

        $sql = "SELECT SUM(price)  as sumprice FROM order WHERE  state=1 AND isdelete=0";        

        $addsql = '';          

        if( $starttime ) $addsql.=" AND createtime>={$starttime}";       

        if( $endtime ) $addsql.=" AND createtime>={$endtime}";       

        $res = Yii::app()->createCommand($sql.$addsql)->queryAll;        //開始時間或結束時間大於等於今天時間戳則建立依賴       

        $date = date('Y-m-d',time());        

        if( $starttime>=strtotime($date) || $endtime>=strtotime($date) ){             

          //依賴條件為最新的訂單時間發生改變   

          $dependency = new CDbCacheDependency('SELECT MAX(createtime)  FROM order WHERE  state=1 AND isdelete=0');          

            Yii::app()->cache->set($cacheid,$res['sumprice'] , 1800,$dependency);        

        }else{    

            Yii::app()->cache->set($cacheid, $res['sumprice'], 1800);       

        }   

    }    

    return Yii::app()->cache->get($cacheid) ;    

} 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM