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秒
php项目优化秘籍
go的切片
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
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
php 基于redis队列 异步订单处理方式
<?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啊 库存和数据库里的同步......
}
}
}
}