Шаблоны для очистки Zend Cache - PullRequest
6 голосов
/ 29 апреля 2011

Я начал использовать 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 или все основано на ключе / значении кэша?

Ответы [ 2 ]

10 голосов
/ 29 апреля 2011

Вы можете применять теги к значениям, хранящимся в кэше. Таким образом, вы можете легко удалить все записи в кэше, которые имеют определенный тег.

$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')
);

См. Эту страницу: http://framework.zend.com/manual/en/zend.cache.theory.html и API для получения подробной информации о методе очистки Zend_Cache_Core: http://framework.zend.com/apidoc/1.11/

4 голосов
/ 01 мая 2011

@ theduke прав, тегирование - правильный способ сделать это, за исключением APC, так как Zend_Cache_Backend_Apc не поддерживает тегирование . От Документ :

Будьте осторожны: с этим бэкэндом «теги» на данный момент не поддерживаются

А из вашего последнего комментария видно, что вы используете APC в качестве бэкэнда. Таким образом, либо вы расширяете этот класс и добавляете поведение тега (добавляя специальный синтаксис в идентификатор тега, обрабатывая сопоставление тега и записи в кэше где-то еще ?, в долгосрочной записи кэша?), Либо вы решаете использовать другой кэш бэкенд.

...