首页 > 解决方案 > 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);
}

知道如何仅缓存请求的值吗?

标签: cachingyii2

解决方案


你需要ArrayCache

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

将其配置为单独的组件:

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

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

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

推荐阅读