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

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

图1

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

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

图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

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

图3

PS 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

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

图4

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

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

图5

a: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

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

图6

if [[ $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

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

图7

2019/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

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

图8

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

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

图9

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

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

图10

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/250508.html

(0)
上一篇 2022年4月29日
下一篇 2022年4月29日

相关推荐

发表回复

登录后才能评论