【问题标题】:CakePHP Cache::write() Can keys be grouped by model?CakePHP Cache::write() 键可以按模型分组吗?
【发布时间】:2011-05-03 16:07:37
【问题描述】:

考虑以下事项;

Cache::write('Model.key1' , 'stuff');
Cache::write('AnotherModel.key1' , 'stuff');
Cache::write('Model.key2' , 'stuff');

我可以从缓存中删除一组键吗?

例如,如果我想清除“Model”的所有缓存数据但将“AnotherModel”保留在缓存中,我想使用以下内容;

Cache::delete('Model.*');

这种事情在CakePHP 1.3.x 中可以实现吗?

谢谢!

【问题讨论】:

  • 您尝试过自己的建议吗?
  • 是的 - 试一试。可能是我的第一个 CakePHP 拉取请求 ;)

标签: php caching cakephp


【解决方案1】:

对于那些只是在谷歌上搜索这个问题的人(就像我一样),Cake 2.2 现在支持这种功能(无需为每个“组”创建单独的缓存配置)。

这里有一点解释,虽然缺少一些细节:
http://book.cakephp.org/2.0/en/core-libraries/caching.html#using-groups

但这就是我在我的应用程序中所做的,它似乎运行良好。 ;-)

/app/Config/core.php

Cache::config('default', array(
    'engine' => $engine,
    ...
    'groups' => ['navigation'],
));

型号afterSave钩子:

function afterSave($created) {
    // This deletes all keys beginning with 'navigation'
    Cache::clearGroup('navigation');
    parent::afterSave($created);
}

然后在需要昂贵查询的控制器/模型中...

// We create a unique key based on parameters passed in
$cacheKey = "navigation.$sitemapId.$levelsDeep.$rootPageId";
$nav = Cache::read($cacheKey);
if (!$nav) {
    $nav = $this->recursiveFind(
        'ChildPage',
        ['page_id' => $rootPageId],
        $levelsDeep
    );
    Cache::write($cacheKey, $nav);
}

【讨论】:

  • 谢谢。我在引导程序的默认缓存配置中添加了:'groups' => array('locs', 'builds', 'quals')。暂时的文件缓存类型。我得到了一个像 builds/locs/quals 这样的文件夹树,然后我所有的新缓存都在那里。我在 AppModel 中,我做了类似的事情: $this->table.'.'.md5(json_encode(func_get_args()));这将给我类似于导航是表名的地方。在我的 AfterSave 中,我做了一个 Cache::clearGroup($this->table);它会清除 /quals 文件夹下的所有缓存。你知道如何实现我想要的吗?
【解决方案2】:

您可以为每个模型设置不同的缓存配置,以便每个配置具有不同的路径。
http://book.cakephp.org/view/1515/Cache-config

我看不到使用缓存类完全删除所有数据的方法,但您可以编写自己的函数来删除特定模型的特定缓存目录中的所有数据(缓存文件)。通过为不同的模型使用不同的配置文件,您可以将模型的缓存数据隔离到每个模型的唯一目录中,然后在要刷新该模型的数据时手动删除内容。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2012-05-09
  • 2012-04-13
  • 2011-10-22
  • 2020-04-20
  • 2011-08-19
  • 2019-06-18
相关资源
最近更新 更多