Yiiでは、キャッシュの関連性をチェックするための
依存関係が提供されます。 彼らは確かに多くを許可しますが、いつものように、十分ではありません。 キャッシュをタグでタグ付けして、タグを削除すると、このタグでマークされたキャッシュ全体が古くなるようにしたかったのです。
グーグルは、これに関するいくつかの記事を見つけました:
最初の記事は、単一のタグ依存関係でキャッシュします。
2番目の記事はすでにいくつかのタグに依存していますが、説明されている構造を使用すると、プロジェクトで驚くような効果がもたらされます。 このタグでタグ付けされたレコードよりもタグの寿命が長くなることを期待することは、私にとって少し軽薄に思えます。
適切なソリューションが見つからないため、
Dklab_Cache_Backend_TagEmuWrapperに基づいてYiiのスタイルで
独自に作成し
ました。
実装する必要があるタスクを策定します。
- 任意の値に1つ以上のタグを付けることができます(必ずしもそうではありません)。
- タグを削除する必要があります
- タグが削除されると、このタグでマークされたキャッシュ全体が無関係になります
今実装。
- タグの関連性を確認できるように、そのバージョンをタグとともに保存します。
- タグ付きレコードとともに、マークされたタグのリストがキャッシュに保存されます。
- キャッシュエントリの関連性をチェックするとき、キャッシュエントリをマークするすべてのタグを引き出し、キャッシュに保存されているタグと比較します
最後の3つの条件の意味を指で説明します。
キー「key」と値「value」でキャッシュエントリを保存するとします。 このレコードにタグ「tagA」、「tagB」を付けます。
このようなもの:
$dependency = new \Cache\Tagged\Dependency(array('tagA', 'tagB')); Yii::app()->cache->set('key', 'value', 0, $dependency);
同時に、3つのエントリがキャッシュに保存されます。
- 'key' =>配列(配列( 'tagA' =>バージョン( 'tagA')、 'tagB' =>バージョン( 'tagB'))、 'value')
- 'tagA' =>バージョン( 'tagA')
- 'tagB' =>バージョン( 'tagB')
実際、YiiはDependencyオブジェクトのコピーを配列に追加し、後でキャッシュの関連性をチェックします。 (ただし、テキストが乱雑にならないように、ここには反映されていません。)
ここで、キャッシュエントリを読み取るとします。
次の手順が実行されます。
- キーを持つレコードが読み取られます。
- レコードに接着されたタグが読み取られます
- キャッシュから読み取られたタグは、レコード内のタグのコピーと比較されます。
- タグが一致しない場合、キャッシュは古いと判断されます
これは非常に簡単です。 そして、ここにコードがあります:
namespace Cache\Tagged; class Dependency implements \ICacheDependency {
この中毒の助手
namespace Cache\Tagged; class Helper { const VERSION = "0.01"; static private $_cache = null; static public function init(\ICache $cacheId = null) { if ($cacheId === null) { if (self::$_cache !== null) { return true; }
なぜなら コードで名前空間を使用した後、設定でエイリアスを登録する必要があります
Yii::setPathOfAlias('Cache', $basepath . DIRECTORY_SEPARATOR . 'components/cache');
また、次のような新しい依存関係を使用できます。
完全に幸福にするために、CActiveRecordデータモデルを透過的にキャッシュします。 (新しいクラスをどこかに適用する必要があります)
次の内容で保護された新しいファイル/ components / ActiveRecord.phpを作成します。
class ActiveRecord extends CActiveRecord { // const CACHE_DURATION = 0; protected function beforeFind() { $tags = array($this->tableName()); $this->cache(self::CACHE_DURATION, new \Cache\Tagged\Dependency(array($tags))); parent::beforeFind(); } protected function afterSave() { \Cache\Tagged\Helper::deleteByTags($this->tableName()); parent::afterSave(); } protected function afterDelete() { \Cache\Tagged\Helper::deleteByTags($this->tableName()); parent::afterDelete(); } }
CActiveRecordの代わりにそれを継承し、データベース接続の減少を観察します