6

Zend Cache (APC バックエンド) の使用を開始しましたが、毎回データベースにアクセスするのではなく、キャッシュされた値を返すという点ですべてがうまくいっています。ただし、私の問題は次のとおりです。

$cache_key = 'getrebates_'.$operator_code;

if(PP_Model_CacheService::exists($cache_key)) {
    $cached_values = PP_Model_CacheService::load($cache_key);
} else {
   //hits the db    
   $cached_values = $this->getAll($operator_code);
   PP_Model_CacheService::save($cached_values, $cache_key);
}
return $cached_values;

各オペレーターには、オペレーターによって異なる独自のリベートがあります。データベースを変更して、すべてのオペレーターのリベートをクリアする必要がある場合、どうすればよいですか?

$Cache->clean()を使用できますが、これにより他のキャッシュがクリアされます (各オペレーターのリベート キャッシュだけではありません)。すべての演算子をループすると:

foreach($operator_codes AS $operator_code) {
   $cache_key = 'getrebates_'.$operator_code;
   $cache->delete($cache_key)
}

これは、キャッシュにとって多くの作業のようです。キャッシュの一部だけをクリアする方法はありますか?

//Something like:
$section_key = 'getrebates';
$Cache[$section_key][$operator_code];
$Cache->clearSection($section_key);

APC キャッシュに配列構造はありますか、それともすべてキャッシュのキー/値ベースですか?

4

2 に答える 2

10

キャッシュに保存されている値にタグを適用できます。そうすれば、特定のタグを持つすべてのキャッシュエントリを簡単に削除できます。

$cache->save($huge_data, 'myUniqueID', array('tagA', 'tagB'));

// clear all cache entries with tag tagA or tagC
$cache->clean(
  Zend_Cache::CLEANING_MODE_MATCHING_TAG,
  array('tagA', 'tagC')
);

Zend_Cache_Coreのクリーンメソッドの詳細については、次のページを参照してください:http: //framework.zend.com/manual/en/zend.cache.theory.htmlおよびAPI:http: //framework.zend.com/apidoc/ 1.11 /

于 2011-04-28T22:07:09.973 に答える
4

Zend_Cache_Backend_Apc はタグ付けをサポートしていないため、APC を除いて、@theduke は正しいです。ドキュメントから:

注意: このバックエンドでは、「タグ」は現時点ではサポートされていません

そして、あなたの最後のコメントから、APC をバックエンドとして使用しているようです。したがって、このクラスを拡張してタグの動作を追加するか (タグ識別子に特別な構文を追加することによって? 長期的なキャッシュ エントリで、タグとキャッシュ エントリのマッピングを別の場所で処理することによって?)、または別のキャッシュを使用することにします。バックエンド。

于 2011-04-30T22:11:48.867 に答える