我正在使用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);
}
有什么主意如何仅缓存请求的值?
答案 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);