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