Yii2仅针对一个请求缓存数据库值

时间:2019-02-25 11:01:42

标签: caching yii2

我正在使用memcached作为Yii2应用程序的缓存组件。背景是我有一个相当复杂的GridView组件,该组件通常调用计数一些关系的关联模型的函数。其中一些功能经常被调用(一次显示一次,然后再次多次评估应该显示哪些操作列。

现在的挑战是我想缓存值,但只缓存唯一的请求,而不缓存任何给定的时间,因为列表经常刷新。下面的代码示例来自该模型。

首先尝试使用缓存的时间较短,如下所示。但是,这似乎不起作用。即使在几分钟后,该值也不会刷新,直到我删除了随附的缓存命令。

public function getRelationCount()
{
    return Yii::$app->cache->getOrSet('wc_'.$this->id.'_cc', function () {
        return $this->getRelationss()->count();
    }, 5);
}

第二种尝试是添加一个ExpressionCondition来标识请求,但是我无法找到一个条件来标识该请求而不是会话。对于会话而言,这很简单:

public function getCompetitorCount()
{
    $dependency = new ExpressionDependency(['expression' => 'Yii::$app->session->getId();']);
    return Yii::$app->cache->getOrSet('wc_'.$this->id.'_cc', function () {
        return $this->getCompetitors()->count();
    }, 30, $dependency);
}

有什么主意如何仅缓存请求的值?

1 个答案:

答案 0 :(得分:2)

您需要ArrayCache

  

ArrayCache仅通过将值存储在数组中来为当前请求提供缓存。

将其配置为单独的组件:

'requestCache' => [
    'class' => ArrayCache::class,
],

并使用它代替Yii::$app->cache

return Yii::$app->requestCache->getOrSet('wc_'.$this->id.'_cc', function () {
    return $this->getRelationss()->count();
}, 5);