Yii schemaCache 配置踩坑
我们都知道如果不配置 enableSchemaCache => true,那么Yii每次操作数据库都会有一堆类似这样的SQL。
SELECT
    `kcu`.`CONSTRAINT_NAME` AS `constraint_name`,
    `kcu`.`COLUMN_NAME` AS `column_name`,
    `kcu`.`REFERENCED_TABLE_NAME` AS `referenced_table_name`,
    `kcu`.`REFERENCED_COLUMN_NAME` AS `referenced_column_name`
FROM `information_schema`.`REFERENTIAL_CONSTRAINTS` AS `rc`
JOIN `information_schema`.`KEY_COLUMN_USAGE` AS `kcu` ON
    (
        `kcu`.`CONSTRAINT_CATALOG` = `rc`.`CONSTRAINT_CATALOG` OR
        (`kcu`.`CONSTRAINT_CATALOG` IS NULL AND `rc`.`CONSTRAINT_CATALOG` IS NULL)
    ) AND
    `kcu`.`CONSTRAINT_SCHEMA` = `rc`.`CONSTRAINT_SCHEMA` AND
    `kcu`.`CONSTRAINT_NAME` = `rc`.`CONSTRAINT_NAME`
WHERE `rc`.`CONSTRAINT_SCHEMA` = database() AND `kcu`.`TABLE_SCHEMA` = database()
AND `rc`.`TABLE_NAME` = 'users_data' AND `kcu`.`TA每次更新数据都会有这么长一条SQL会被执行,而线上运行的项目,表结构也不会经常改变,所以这种每次这种查询有点太浪费性能了,徒增IO,所以一般线上稳定运行的项目,我们会开启 schemaCache。
'db' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=127.0.0.1;dbname=testdb',
        'username' => 'root',
        'password' => '1234567',
        'charset' => 'utf8mb4',
        'enableSchemaCache' => true,
        'schemaCacheDuration' => 3600, // Duration of schema cache.
        'schemaCache' => 'redis', // Name of the cache component used to store schema information
]和 schemaCache有关的主要是三个参数
- enableSchemaCache是否开启schema缓存
- schemaCacheDurationschema缓存的时间,单位s
- schemaCache存储schema信息的缓存组件的名称
主要是 schemaCache这个配置,如果你不配置,Yii会找 cache组件,默认情况下是cache组件是这样的。
'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
]可以看到默认是通过文件缓存的方式缓存schema信息,但是我手懂配置了 'schemaCache' => 'redis',所以Yii框架去找我的 redis 组件是去缓存schema信息,我的redis组件是什么样的呢。
'components' => [
     'redis' => [
            'class' => 'yii\redis\Connection',
            'hostname' => '127.0.0.1',
            'port' => 6379,
            'password' => '1234567',
            'database' => 0,
        ],   
]可以看到我的redis组件只是一个redis的连接,class是 yii\redis\Connection,然后我以为一切都万事大吉了,直到今天我查看runtime的log,我发现每次更新数据的时候还是会查询information_schema表,每次还是会有开头的长SQL被执行,为什么我的schemaCache没有生效呢???
然后我看了一下如果我不配置'schemaCache' => 'redis',他会找cache组件,而cache组件是一个yii\caching\FileCache,它实现了 yii\caching\CacheInterface 接口,而 yii\caching\CacheInterface接口定义了一系列增删改查的方法。
所以 schemaCache组件必须实现 yii\caching\FileCache 接口,Yii才能用的schemaCache组件缓存schema信息。
'components' => [
    'cache' => [
            // 'class' => 'yii\caching\FileCache',
            'class' => 'yii\redis\Cache',
            'keyPrefix' => 'yiicache_',
        ], 
]相关阅读
 
         
                 
     
     
                                 
                                 
                                 
                                
学习了,感觉论坛有些冷清啊,就几个人。