如何使模型缓存失效 |法尔康 4

问题描述 投票:0回答:3

我有以下缓存模型查询,它工作正常,

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();
    }

但是如何使用密钥使缓存无效,我已经阅读了文档但找不到任何如何使用密钥使缓存无效的信息。

php phalcon
3个回答
0
投票

如果你只是想做一个偶尔的失效,我倾向于使用一个简单的缓存破坏器。

当我的 CI/CD 管道运行时,我将生成一个看起来像

<?php return ['cache' => ['buster' => 'abc123']];
的文件,其中
abc123
是提交哈希。

然后,在代码中,我将缓存破坏器用作任何给定键(更常见的是前缀)的一部分,我想在部署时使其失效。

值得注意的是,您并不是在字面上使缓存无效,而是更改缓存的前缀,这实际上使其无效。也就是说,如果您的缓存有无限的 TTL,它们将永远不会过期。您希望您的 TTL 合理,以便它们在合理的时间后失效,这样您的缓存服务器就不会保留死数据。


0
投票

您可以使用您正在使用的缓存服务/适配器的

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;
         
         // ...
    }
}

0
投票

要使带有键的缓存失效,可以使用 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() 方法使指定键的缓存失效。

确保在类中注入缓存依赖项,在本例中为“缓存”。

© www.soinside.com 2019 - 2024. All rights reserved.