Caching Yii2仅为一个请求缓存数据库值

Caching Yii2仅为一个请求缓存数据库值,caching,yii2,Caching,Yii2,我正在使用memcached作为我的Yii2应用程序的缓存组件。背景是我有一个相当复杂的GridView组件,它经常调用关联模型的函数来计算一些关系。其中一些函数经常被调用(一次用于显示,多次用于评估应显示哪些操作列) 现在的挑战是,我希望缓存该值,但仅针对唯一请求,而不是针对任何给定的时间段,因为列表经常刷新 第一次尝试只是在短时间内使用缓存,如下所示。但这似乎不起作用。即使在几分钟后,在我删除封闭的缓存命令之前,该值也不会刷新 public function getRelationCount

我正在使用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);
}
知道如何仅缓存请求的值吗?

您需要:

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

将其配置为单独的组件:

'requestCache' => [
    'class' => ArrayCache::class,
],
并使用它而不是
Yii::$app->cache

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

谢谢@rob006,它工作得很好。很高兴知道ArrayCache是专门为此设计的。