原则 2 结果缓存无效



我正在使用原则 2 的结果缓存来检索用户(消息传递应用程序)的新消息数量:

$query->useResultCache(true, 500, 'messaging.nb_new_messages.'.$userId);

我试图像这样使这个缓存失效(在我的实体存储库中):

public function clearNbNewMessagesOfUserCache($userId) {
    $cacheDriver = $this->getEntityManager()->getConfiguration()->getResultCacheImpl();
    $result  = $cacheDriver->delete('skepin_messaging.nbNewMessages.'.$userId);
    if (!$result) {
        return false;
    }
    return $cacheDriver->flushAll();
}

这样我就不需要在网站的每个页面上进行无用的查询。

我的问题:这是推荐的做法吗?我最终会遇到问题吗?

我想建立一个onFlush钩子。在那里,所有实体都排队等待插入,更新和删除,因此您可以根据实体名称和标识符等使缓存失效。

不幸的是,我还没有构建任何事件侦听器,但我绝对计划为我的项目构建这样的东西。

这是指向 onFlush 事件的学说文档的链接

编辑:甚至还有一种更简单的方法来实现事件。在实体类中,您可以向批注添加@HasLifecycleCallbacks,然后可以使用@PreUpdate或@PrePersist批注定义函数。每次更新或保留此模型时,都会调用此函数。

/**
 * @Entity
 * @Table(name="SomeEntity")
 * @HasLifecycleCallbacks
 */
class SomeEntity
{
    ...
    /**
     * @PreUpdate
     * @PrePersist
     */
    public function preUpdate()
    {
        // This function is called every time this model gets updated
        // or a new instance of this model gets persisted
        // Somethink like this maybe... 
        // I have not yet completely thought through all this.
        $cache->save(get_class($this) . '#' . $this->getId(), $this);
    }
}

因此,也许这可以用来使实体的每个实例无效?

这是我偶然发现的一个老问题。现在使用Doctrine 2.8非常简单:

/** @var PsrCacheCacheItemPoolInterface|null $cache */
$cache = $em->getConfiguration()->getResultCache();
$cache->deleteItem('skepin_messaging.nbNewMessages.'.$userId);
$cache->clear(); // clear all items

请注意,Doctrine 在内部生成一个"真正的缓存键",看起来不像你的。我不知道如何在不重新创建使用的查询的情况下生成该缓存键。

相关内容

  • 没有找到相关文章

最新更新