Шаблоны для очистки кэша Zend
Я начал использовать Zend Cache (APC backend), и все хорошо с точки зрения возврата кэшированных значений вместо того, чтобы каждый раз попадать в базу данных. Однако, вот моя проблема:
$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 ответов
вы можете применить теги к значениям, хранящимся в кэше. Таким образом, вы можете легко удалить все записи кэша, которые имеют определенный тег.
$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/
@theduke прав, пометка-правильный способ сделать это, за исключением APC, как Zend_Cache_Backend_Apc не поддерживает пометки. От док:
будьте осторожны : с этим бэкэндом, " теги" на данный момент не поддерживаются
и из вашего последнего комментария он sems вы используете APC в качестве бэкэнда. Итак, либо вы расширяете этот класс и добавляете поведение тега (добавляя специальный синтаксис в идентификатор тега? путем обработки тега vs сопоставление записей кэша где-то еще?, в долгосрочной записи кэша?), или вы решите использовать другой бэкэнд кэша.