Значения базы данных кэша Yii2 только для одного запроса - PullRequest
0 голосов
/ 25 февраля 2019

Я использую 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 голосов
/ 25 февраля 2019

Вам необходимо ArrayCache:

ArrayCache обеспечивает кэширование для текущего запроса только путем сохранения значений в массиве.

Настройкаэто как отдельный компонент:

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

И используйте его вместо Yii::$app->cache:

return Yii::$app->requestCache->getOrSet('wc_'.$this->id.'_cc', function () {
    return $this->getRelationss()->count();
}, 5);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...