我有以下缓存模型查询,它工作正常,
public static function getSubcategories($partnerId)
{
$instance = new self();
$q = $instance->modelsManager->createBuilder();
$q = $q->columns([
'cc.category',
'cc.type',
'cc.slug',
'cc.title',
])
->from(['cc' => CatalogCategories::class])
->join(PartnerTypes::class, 'cc.category = pt.typeSlug', 'pt')
->where('pt.parentId = :partnerId:', compact('partnerId'));
$cacheKey = 'getSubcategories';
if ($partnerId) {
$cacheKey .= '_' . $partnerId;
}
$q = $q->getQuery();
if($instance->getDI()->get('config')->cache->isEnabled){
$q = $q->cache(
[
'key' => $cacheKey,
'lifetime' => $instance->getDI()->get('config')->cache->duration->min15,
]
);
}
return $q->execute();
}
但是如何使用密钥使缓存无效,我已经阅读了文档但找不到任何如何使用密钥使缓存无效的信息。
如果你只是想做一个偶尔的失效,我倾向于使用一个简单的缓存破坏器。
当我的 CI/CD 管道运行时,我将生成一个看起来像
<?php return ['cache' => ['buster' => 'abc123']];
的文件,其中 abc123
是提交哈希。
然后,在代码中,我将缓存破坏器用作任何给定键(更常见的是前缀)的一部分,我想在部署时使其失效。
值得注意的是,您并不是在字面上使缓存无效,而是更改缓存的前缀,这实际上使其无效。也就是说,如果您的缓存有无限的 TTL,它们将永远不会过期。您希望您的 TTL 合理,以便它们在合理的时间后失效,这样您的缓存服务器就不会保留死数据。
您可以使用您正在使用的缓存服务/适配器的
delete()
方法,即
$this->get('modelsCache')->delete($cacheKey);
作为旁注,如果您添加 $partnerId 的类型,您可以更早地退出该函数并删除将始终验证为 true 的额外条件:
public static function getSubcategories(int $partnerId)
{
if ($partnerId === 0) then return [];
// ...
if ($instance->getDI()->get('config')->cache->isEnabled) {
$cacheKey = 'getSubcategories_' . $partnerId;
// ...
}
}
要使带有键的缓存失效,可以使用 Phalcon\Cache\BackendInterface 接口的 delete() 方法。这是一个例子:
$cacheKey = 'getSubcategories';
if ($partnerId) {
$cacheKey .= '_' . $partnerId;
}
// ...
// Invalidating the cache with key
$cache = $instance->getDI()->get('cache');
if ($cache->exists($cacheKey)) {
$cache->delete($cacheKey);
}
首先需要使用 Phalcon\Cache\BackendInterface 接口的 exists() 方法检查具有指定键的缓存是否存在。如果存在,则可以调用 delete() 方法使指定键的缓存失效。
确保在类中注入缓存依赖项,在本例中为“缓存”。