【问题标题】:Yii2 cache of grid view网格视图的 Yii2 缓存
【发布时间】:2019-10-14 17:38:50
【问题描述】:

我有一个跨 8 个表的相对复杂的查询,它返回多达 20 列的 10,000 条记录。然后将它们显示在 GridView 中

用户反复对 GridView 进行排序和过滤 - 导致页面重新加载 - 以便对数据进行排名。一列包含一个 Ajax “五星”评级函数,然后用户标记每一行:一星到五星

当然,这不是加载速度最快的页面,所以我想知道是否可以使用缓存来加速页面加载,但不知道考虑到过滤和标记是否可以这样做

在这个例子中可以使用缓存吗?第 19 列的数据始终相同(用户无法更改数据)但用户不断更改第 20 列的评分

我可以缓存这 19 列并过滤/排序吗?

我可以缓存这 19 列然后加入评分列吗?

非常感谢

【问题讨论】:

  • 从技术上讲,可以缓存查询的查询结果并在 php.ini 中进行排序/过滤。但是当你让 mysql 处理过滤/排序而不缓存结果时,你可能会得到更差的性能。您可能需要考虑而不是缓存的事情:1)优化 sql 查询。 2)正确设置索引 3)反规范化 4)分页
  • 谢谢。我过去使用过临时表和非规范化,效果很好。我会再走那条路。

标签: caching gridview yii2


【解决方案1】:

您可以轻松使用 yii2 的PageCache filter 行为来轻松缓存页面。

只需将以下代码添加到您的控制器,并根据您的需要调整依赖项和变体属性。

public function behaviors()
{
    return [
        'pageCache' => [
            'class' => 'yii\filters\PageCache',
            'only' => ['index'],
            'duration' => 60,
            'dependency' => [
                'class' => 'yii\caching\DbDependency',
                'sql' => 'SELECT COUNT(*) FROM post',
            ],
            'variations' => [
                \Yii::$app->language,
            ]
        ],
    ];
}

【讨论】:

  • 谢谢!如果用户过滤数据,页面是否仍会从缓存中加载???我的理解是更改会导致完整的查询
  • 您必须以某种方式将过滤器键和值传递给变体字段,这样即使过滤后的结果也会被缓存
猜你喜欢
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
相关资源
最近更新 更多