caching - 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);
}
知道如何仅缓存请求的值吗?
解决方案
你需要ArrayCache
:
ArrayCache 仅通过将值存储在数组中来为当前请求提供缓存。
将其配置为单独的组件:
'requestCache' => [
'class' => ArrayCache::class,
],
并使用它代替Yii::$app->cache
:
return Yii::$app->requestCache->getOrSet('wc_'.$this->id.'_cc', function () {
return $this->getRelationss()->count();
}, 5);
推荐阅读
- ios - 如何在 ImageView 的不同角落对齐 textLabel
- r - 使用 r4.0.2 在 macOS Catalina 版本 10.15.6 上的 RStudio 中安装 leidenbase 和 monocle3 包时出错
- powershell - Powershell ISE $profile 为空
- reactjs - 我在创建一个反应项目时遇到了困难,我不知道我做错了什么
- apache-spark - Mesos 失败并出现错误:无法加载类...命令退出,状态为 101 Spark3、Mesos 1.9.0、Jdk 无头 11 RHEL 7
- html - Div 样式浮动:左侧清除不工作
- javascript - 为什么 getElementsByClassName 和 querySelector 不起作用?
- asp.net-core - 如何在每个 IdentityServer4 api 调用中获取客户端信息?(用于记录目的)
- java - 如何在Android中更改文本之间等待几秒钟?
- linux - Jansson 构建错误