php项目优化秘籍

作者: 时间: 2022-06-16 评论: 暂无评论

1.opchache 性能加强20%
2.水平分表,减少一半字段,对select count(money) 加强15%,对select * 加强在50%
3.PB级数据,列存sql(比如 select count(money)),建议上polardb。记得忽略索引(where 1=1 或 use index())。1000万条数据,mysql需要40s,列存数据3秒

go的切片

作者: 时间: 2022-05-29 评论: 暂无评论

1.看一段代码
func main() {

    s1 := [5]int{0, 1, 2, 3, 4}
    s2 := s1
    s2[0] = 999
    fmt.Println(s1)   //[0 1 2 3 4]

    s3 := []int{0, 1, 2, 3, 4}
    s4 := s3
    s4[0] = 999    //[999 1 2 3 4]   s3数组是值类型,s3 切片本身是个引用类型
    fmt.Println(s3)
}

系统评估 Qps和Tps

作者: 时间: 2022-05-15 评论: 暂无评论

1、TPS是什么意思?
TPS全称是:Transaction Per Second,意思是指每秒事务数。TPS是衡量系统性能的一个非常重要的指标。

人们常常混淆并发量与TPS,它们两者的作用不同。如同一条马路,我们关注点是:有几个车道,以及是否拥挤?并发量对应于车道,而TPS对应于拥挤程度。

在做性能测试的时候,传统方式都是用并发数来衡量系统的性能,一般适用于一些网页站点的首页、H5页面的压测。这是站在客户端的视角。而TPS则直接衡量系统的吞吐能力,应用场景主要是一些动态的接口API,例如登录、提交订单等等。这是站在服务端视角的。

2、TPS和并发量的关系
TPS是每秒事务数,但是事务是要靠用户做出来的,假如1个用户在1秒内完成1笔事务,那么TPS明显就是1;如果某笔业务响应时间是1 ms,那么1个用户在1s内能完成1000笔事务,TPS就是1000了;如果某笔业务响应时间是1s,那么1个用户在1s内只能完成1笔事务,要想达到1000 TPS,至少需要1000个用户;因此可以说1个用户可以产生1000 TPS,1000个用户也可以产生1000 TPS,无非是看响应时间快慢。

3、如何获取并发量和TPS
3.1、并发量获取方式:
可选取高峰时刻,在一定时间内使用系统的人数,这些人数可认为是在线用户数,并发用户数可以取10%,例如在半个小时内,使用系统的用户数为10万,那么取10%(即1万)作为并发用户数基本就够了。

3.2、TPS获取方式:
可选取高峰时刻,在一定时间内(如3分钟~10分钟),获取系统总业务量,计算单位时间(秒)内完成的笔数,乘以2~5倍作为峰值的TPS,例如峰值3分钟内处理订单18万笔,平均TPS是1000,峰值TPS可以是2000~5000。

4、如何评价系统的性能
针对服务器端的性能,以TPS为主来衡量系统的性能,并发用户数为辅来衡量系统的性能。

5、小结
综上所述,可以得出以下结论:

系统的性能由TPS决定,跟并发用户数没有多大关系。
系统的最大TPS是一定的(在一个范围内),但并发用户数不一定,可以调整。
标签: none

Sql的执行顺序

作者: 时间: 2022-05-11 评论: 暂无评论

sql执行顺序.png

php 基于redis队列 异步订单处理方式

作者: 时间: 2022-05-09 评论: 暂无评论
<?php
/**
 * Created by PhpStorm.
 * User: yann
 * Date: 2017/8/3
 * Time: 上午10:49
 */

$redis_ip = '127.0.0.1';

$logs_path = '/data/php/logs/';

$log_name = 'laravel-' . date('Y-m-d') . '.log';

$mysql_ip = '127.0.0.1';

for ($i = 0; $i <= 5; $i++) //开进程

{

    $ret = pcntl_fork(); //生成进程

    if ($ret == 0) {

        while (true) //做一个循环,让进程反复运行

        {

            $redis = new Redis();//连接redis

            $redis->connect($redis_ip, 6379);

            if (count($redis->keys('panicbuying')) == 0) //判断队列中是否有序列,如果没有则继续 “死”循环

            {

                sleep(1);

                continue;

            }

            $getjob = $redis->zrange('panicbuying', 0, 0); //从队列中取出一个

            $color_id = json_decode($getjob[0], 1)['stock_id'];

            if ($redis->setnx("buy_lock_" . $color_id, 1) == 1) //加锁 后期需要优化防止出错卡死 设置超时时间

            {

                $num = json_decode($getjob[0], 1)['num'];

                $pro_stock = $redis->hget('products_stock', $color_id);

                $surplus_stock = $pro_stock - $num;

                $redis->multi(); // redis事务开始

                if ($surplus_stock >= 0) {

                    $redis->hset('products_stock', $color_id, $surplus_stock);

                }

                $redis->zrem('panicbuying', $getjob[0]); //删除当前队列

                $redis->del("buy_lock_" . $color_id); //解锁

                $redis->exec(); //结束事务

                // 这里写你自己需要的一些处理 比如 写一些log啊 库存和数据库里的同步......

            }

        }

    }

}