通过优化接口、代码、SQL、缓存做性能优化

系统优化应该先从编码层面开始,这样能够让代码更容易维护,性能的提升很显著,又不会增加(反而会节省)硬件资源。接下来开始吧:

优化前页面ajax请求最高的达到6.75秒,这样的体验是很糟糕的。

从监控上可以看到几个优化点:

1. 接口get-charts-time-v3和get-new-sale都请求了2次,最好合并为一个;
2. 接口get-color-nums-v4和get-new-sale响应时间都在6秒以上,需要优化;

好了,开始工作:

1. 将多次请求合并为一个:
经过分析发现代码中是分别请求了两种类型的项目,原来只提供了查询某种类型项目数据的接口,所以要请求两次,为了合并为一次请求,要封装个接口,能够完成查询所有类型项目数据;
原来接口,需要判断传入参数来获取不同类型项目数据:

新增加接口,数据处理方法写到一个组件里:

    /**
     * 获取用户项目, 按状态统计
     * @return InterfaceController
     */
    public function getColorNumsV4(){
        $count = $this->GetInfo->getUserProjectNumGroupByStatus();
        $result = ['status' => 'success', 'data' => $count, 'message' => 'get color counts'];
        return $this->returnJsonDataV1($result);
    }
    /**
     * 获取用户所有项目, 按状态统计数量
     * @return array
     */
    public function getUserProjectNumGroupByStatus()
    {
        $query = $this->ProjectOverviews->find();
        $count = $query->select(['status', 'count' => $query->func()->count('*')])
            ->group(['ProjectOverviews.status'])
            ->toArray();

        foreach ($count as $eachCount) {
            if ($eachCount['status'] === 1) $redNum = $eachCount['count'];
            if ($eachCount['status'] === 2) $yellowNum = $eachCount['count'];
            if ($eachCount['status'] === 3) $greenNum = $eachCount['count'];
        }
        $count = [$redNum, $yellowNum, $greenNum];
        return $count;
    }

可以看到这里把原来接口里糟糕的多次查询,整合为了一个。为了向下兼容,返回的数据做了格式处理,与原来接口一致。优化后接口响应时间降到了71ms:

2. 优化SQL、引入缓存
在不影响原有逻辑的前提下,优化接口代码:

可以看到判断逻辑进行优化,用关联查询取代原来的多步查询,接口性能有了很大提升,第一次请求没有缓存的情况下1.18s:

缓存命中的效率达到603ms:

Mac上PHPRedis扩展安装:

Mac上PHPRedis扩展安装:
下载:https://nodeload.github.com/nicolasff/phpredis/zip/master
解压并进入代码目录配置编译:
tar -zxvf phpredis-master.zip
cd phpredis
sudo phpize
./configure --with-php-config=/usr/local/opt/php/bin/php-config
make
make install
编译完成后扩展所在目录:/usr/local/Cellar/php/7.3.2/pecl/20180731/
编辑php.ini增加扩展:
vi /usr/local/etc/php/7.3/php.ini
增加:extension = redis;
​​​​​​​重启apache:sudo apacheclt restart

最终页面的各项响应时间都在1s左右:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铭记北宸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值