Yii2将数据库表镜像到redis以进行高速活动记录查询

时间:2018-04-22 16:18:51

标签: mysql yii redis yii2 yii-extensions

我要做的是将所有结果缓存在很少更改的MySQL表中,以便最大限度地减少对数据库的调用并提高查询速度。那里有大约10万条记录。

是否有可以同步此表中所做更改的库,例如更新或插入记录时,redis缓存也将失效和更新。

我见过一个弹性搜索,但没有用于redis。

从此页面: Yii copying data from one model to another

有这样的评论:

  

您可以通过以下方式获取所有模型属性:

     

$ data = $ model->属性;   并将它们分配给另一个模型

     

$ anotherModel = new AnotherActiveRecord();

     

$ anotherModel-> setAttributes($数据);

     

现在另一个模型将从$ data

中提取任何内容

我很好奇,Redis缓存是否也能以类似的方式“镜像”数据库表中的数据?

或者这总体上是一个坏主意,最好在查询时缓存查询,或者是否有更好的方法。

1 个答案:

答案 0 :(得分:0)

您可以根据https://www.yiiframework.com/doc/guide/2.0/en/caching-data

启用缓存
[
    'components' => [
        'cache' => [
            'class' => 'yii\redis\Cache',
            'redis' => [
                'hostname' => 'localhost',
                'port' => 6379,
                'database' => 0,
            ]
        ],
    ],
]

然后使用在查询构建器级别

上本机定义的Query Caching
$result = $db->cache(function ($db) {
    // the result of the SQL query will be served from the cache
    // if query caching is enabled and the query result is found in the cache

    // ... perform SQL queries here ...
});

此外,您可以根据您的表格使用Cache Dependencies(如果max(updated_at)已更改,则可以使用某些条件)。

// Create a dependency on updated_at field
$dependency = new yii\caching\DbDependency(['sql' => 'select max(updated_at) from my_table']);
$duration = 60;     // cache query results for 60 seconds.

$result = $db->cache(function ($db) {
    // ... perform SQL queries here ...

    return $result;
}, $duration, $dependency);