我开始使用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)
}
这对缓存来说似乎有很多工作要做。有没有办法清除Cache的一部分。
//Something like:
$section_key = 'getrebates';
$Cache[$section_key][$operator_code];
$Cache->clearSection($section_key);
APC缓存是否有任何数组结构,还是基于缓存键/值?
答案 0 :(得分: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/
答案 1 :(得分:4)
@theduke是对的,标记是正确的方法,除了APC,因为 Zend_Cache_Backend_Apc不支持标记。来自the doc:
小心:有了这个后端,“标签” 目前不支持
从你最后的评论中可以看出,你正在使用APC作为后端。因此,要么扩展此类并添加标记行为(通过在标记标识符中添加特殊语法?通过在长期缓存条目中处理标记与缓存条目映射?),或者您决定使用另一个缓存后端。