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缓存schemaCacheDuration
schema缓存的时间,单位sschemaCache
存储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_',
],
]
相关阅读
学习了,感觉论坛有些冷清啊,就几个人。