yii mysql 缓存_Yii 2.0 的性能优化之开启 Schema 缓存

1、在应用运行的环境为开发环境,即 YII_ENV 的值为 dev 时,关闭 Schema 缓存,编辑 environments/dev/common/config/main-local.php

'db' => [

'class' => 'yii\db\Connection',

'dsn' => 'mysql:host=localhost;dbname=g-p-y-a-a-c',

'username' => 'g-p-y-a-a-c',

'password' => 'H9xQ0wnWTDEAbRk9',

'tablePrefix' => 'ac_',

'charset' => 'utf8mb4',

'enableSchemaCache' => false,

'schemaCacheDuration' => 3600,

'schemaCache' => 'redisCache',

],

2、在应用运行的环境为生产环境,即 YII_ENV 的值为 prod 时,开启 Schema 缓存,编辑 environments/dev/common/config/main-local.php

'db' => [

'class' => 'yii\db\Connection',

'dsn' => 'mysql:host=localhost;dbname=g-p-y-a-a-c',

'username' => 'g-p-y-a-a-c',

'password' => 'H9xQ0wnWTDEAbRk9',

'tablePrefix' => 'ac_',

'charset' => 'utf8mb4',

'enableSchemaCache' => true,

'schemaCacheDuration' => 3600,

'schemaCache' => 'redisCache',

],

3、在开启 Schema 缓存后,查看 Redis,键名:sa:cache:84f9ac2fc2a79a80b91b6ddd83286798,已经存在 Schema 缓存数据,如图1

76a1ce865d4dadec3af5dcea4a7b5609.png

图1

4、为了避免在执行了新的数据库迁移后,数据表结构有变更。模拟一下数据库迁移的实现手动更新表结构,添加字段:is_deleted,如图2

e4407c085af66211e3f2e3dc4639dd91.png

图2

5、再次请求接口(与 user 表相关),查看 Redis,键名:sa:cache:84f9ac2fc2a79a80b91b6ddd83286798,发现新添加字段:is_deleted,还未更新至缓存中

6、由于数据表结构有变更,进而导致 Schema 缓存数据 与 Schema 数据 的不一致,因此,需要清除给定连接组件的数据库表结构缓存。参考网址:https://www.yiiframework.com/doc/guide/2.0/zh-cn/caching-data ,执行控制台命令,但是查看 Redis,键名:sa:cache:84f9ac2fc2a79a80b91b6ddd83286798,发现新添加字段:is_deleted,仍然还未更新至缓存中,如图3

cacd034f098f69cc9ef03a2386500263.png

图3PS E:\wwwroot\gitlab-php-yii2-app-advanced-cmc> ./yii cache/flush-schema db

Flush cache schema for "db" connection? (yes|no) [no]:yes

Schema cache for component "db", was flushed.

7、再次请求接口(与 user 表相关),查看 Redis,键名:sa:cache:84f9ac2fc2a79a80b91b6ddd83286798,发现新添加字段:is_deleted,已经更新至缓存中,符合预期。由此得出结论,清除给定连接组件的数据库表结构缓存后,相应的缓存并未即时更新,而是在有使用到相应的表结构的时候,再触发更新(仅更新涉及到的相应表,未涉及到的表不会更新)。如图4

153da6bb98f0ee7841f1770cfd65d3a2.png

图4

8、再次分析触发更新的原理,应该在于键名:sa:cache:28c0caa7a3c3c0bfa2e9d21956903c9d,在清除给定连接组件的数据库表结构缓存后,其值发生了变化,之前与之后的值对比,如图5

8fcb16e7553fe2c70e3a907e5a0d070d.png

图5a:2:{i:0;s:21:"0.25243100 1577424191";i:1;N;}

a:2:{i:0;s:21:"0.84367400 1577424375";i:1;N;}

9、在 Docker 部署时,在容器升级时,执行了数据库迁移命令后,再执行清除给定连接组件的数据库表结构缓存的命令。编辑 build/c_files/config/init/console_init.sh,如图6

0d139aa4376a3f271ed1feec924f779b.png

图6if [[ $PCS_API_CFG_MIGRATE == "true" ]]

then

php /mcloud/www/pcs-api/yii migrate --migrationPath=@yii/log/migrations/ --interactive=0

php /mcloud/www/pcs-api/yii migrate --interactive=0

php /mcloud/www/pcs-api/yii cache/flush-schema db --interactive=0

elif [[ $PCS_API_CFG_MIGRATE == "false" ]]

then

echo "running without db migrate"

else

echo "please set environment variable PCS_API_CFG_MIGRATE true or false"

fi

10、基于 Rancher 升级容器时,在应用运行的环境为生产环境,即 YII_ENV 的值为 prod 时,查看升级日志,Schema cache for component “db”, was flushed.,如图7

f9ae02a7e58a15e656392e976635f042.png

图72019/12/27 下午3:24:28PCS_API_CFG_ENV=prod

2019/12/27 下午3:24:28Yii Application Initialization Tool v1.0

2019/12/27 下午3:24:28

2019/12/27 下午3:24:28

2019/12/27 下午3:24:28 Start initialization ...

2019/12/27 下午3:24:28

2019/12/27 下午3:24:28 generate console/config/main-local.php

2019/12/27 下午3:24:28 generate console/config/params-local.php

2019/12/27 下午3:24:28 generate common/config/main-local.php

2019/12/27 下午3:24:28 generate common/config/params-local.php

2019/12/27 下午3:24:28 generate yii

2019/12/27 下午3:24:28 generate api/web/index.php

2019/12/27 下午3:24:28 generate api/web/robots.txt

2019/12/27 下午3:24:28 generate api/config/main-local.php

2019/12/27 下午3:24:28 generate api/config/params-local.php

2019/12/27 下午3:24:28 generate frontend/web/index.php

2019/12/27 下午3:24:28 generate frontend/web/robots.txt

2019/12/27 下午3:24:28 generate frontend/config/main-local.php

2019/12/27 下午3:24:28 generate frontend/config/params-local.php

2019/12/27 下午3:24:28 generate rpc/web/index.php

2019/12/27 下午3:24:28 generate rpc/web/robots.txt

2019/12/27 下午3:24:28 generate rpc/config/main-local.php

2019/12/27 下午3:24:28 generate rpc/config/params-local.php

2019/12/27 下午3:24:28 generate backend/web/index.php

2019/12/27 下午3:24:28 generate backend/web/robots.txt

2019/12/27 下午3:24:28 generate backend/config/main-local.php

2019/12/27 下午3:24:28 generate backend/config/params-local.php

2019/12/27 下午3:24:28 generate cookie validation key in backend/config/main-local.php

2019/12/27 下午3:24:28 generate cookie validation key in frontend/config/main-local.php

2019/12/27 下午3:24:28 generate cookie validation key in api/config/main-local.php

2019/12/27 下午3:24:28 chmod 0777 backend/runtime

2019/12/27 下午3:24:28 chmod 0777 backend/web/assets

2019/12/27 下午3:24:28 chmod 0777 frontend/runtime

2019/12/27 下午3:24:28 chmod 0777 frontend/web/assets

2019/12/27 下午3:24:28 chmod 0777 api/runtime

2019/12/27 下午3:24:28 chmod 0777 api/web/assets

2019/12/27 下午3:24:28 chmod 0755 yii

2019/12/27 下午3:24:28

2019/12/27 下午3:24:28 ... initialization completed.

2019/12/27 下午3:24:28

2019/12/27 下午3:24:28PCS_API_CFG_MIGRATE=true

2019/12/27 下午3:24:28Yii Migration Tool (based on Yii v2.0.15.1)

2019/12/27 下午3:24:28

2019/12/27 下午3:24:28No new migrations found. Your system is up-to-date.

2019/12/27 下午3:24:28Yii Migration Tool (based on Yii v2.0.15.1)

2019/12/27 下午3:24:28

2019/12/27 下午3:24:28No new migrations found. Your system is up-to-date.

2019/12/27 下午3:24:29Schema cache for component "db", was flushed.

11、同一个接口(查询),在开启 Schema 缓存前,其性能测试结果,并发(峰值/上限):120/150,如图8

49a9d1db1df50a17be57491872493ec6.png

图8

12、同一个接口(查询),在开启 Schema 缓存前,其性能测试结果,在并发数为 105 的时候,请求是一直成功的。上升至 120 ,就开始失败了。因此,可以认为其实际的并发峰值为 105,如图9

0c15165644996f92b6209c4b7454be2b.png

图9

13、同一个接口(查询),在开启 Schema 缓存后,其性能测试结果,在并发数为 90 的时候,请求是一直成功的。上升至 105 ,就开始失败了。因此,可以认为其实际的并发峰值为 90,性能优化效果不甚明显,甚至有所倒退,但是,决定先就这样了,不回退版本,如图10

80e3e914a2bc9ade860ea686ba95dfe9.png

图10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值