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 的 clean 方法的详细信息,请参阅此页面: 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

@theduke 是对的,标记是正确的方法,除了 APC,因为Zend_Cache_Backend_Apc 不支持标记。从文档

请注意:使用此后端,目前不支持“标签”

从您上次的评论来看,您似乎正在使用 APC 作为后端。因此,要么扩展此类并添加标签行为(通过在标签标识符中添加特殊语法?通过在其他地方处理标签与缓存条目映射?在长期缓存条目中?),或者您决定使用另一个缓存后端。

于 2011-04-30T22:11:48.867 回答