(思维进阶)三、性能优化面试

1、出现性能瓶颈如何定位解决

a. 分析硬件资源占用

查看CPU利用率、内存利用率

ps -aux中(a指代all——所有的进程,u指代userid——执行该进程的用户id,x指代显示所有程序,不以终端机来区分)

检查数据库网络延迟

ping xx

b. 代码性能分析工具

xphrof|php7tideways_xhprof -- 主动性能分析

安装Tideways和Toolkit对PHP代码进行性能分析

swoole-tracker 可以监测php-fpm

swoole-tracker安装客户端

c. 优化方案

使用缓存


PHP缓存工具
yac是用于PHP的快速,无锁的共享内存用户数据缓存。它可以用来代替APC或本地memcached。

使用php内置函数


php数组函数
array_merge 如果两个或更多个数组元素有相同的键名,则最后的元素会覆盖其他元素
array_reduce(array,myfunction,initial) 函数发送数组中的值到用户自定义函数,并返回一个字符串

isset 语言构造器:isset()会同时检查键和值,只有当健存在,对应的变量不为NUll的时候才会返回TURE
array_key_exists 函数:这个函数会返回TRUE,只要键值存在,即使值为NULL

使用PHP扩展

通过php扩展替代高频逻辑

d. 日常代码规范化注意事项

来源

减少使用PHP魔法函数
合理使用内存unset
正则表达式
避免在循环中做运算
减少计算密集型业务

2、笔试题

a. 简述如何实现单点登录

单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分。
client -- service1 -- seo认证

登录

1* 用户client访问 service1跨域,检查是否登录,如果没有;
2* 带上自己的地址目的地址为参数跳转到认证中心,sso检查是否登录,如果没有:跳转到登录页,登录;
3* 生成令牌token添加到目的地址,并跳转到service1;
4* service1 请求sso,检查token是否有效,如果有,注册用户;
5* service1 使用token与client进行通讯。

注销

1* 用户client向 service1 发起注销请求,注销;
2* service1向sso请求使token失效。

b. MYSQL优化总结

MYSQL优化总结(全栈须知)8.MYSQL优化总结
【背诵】合理建表-表结构优化,规范SQL-查询优化

数据库表结构设计:分库、分表、大表分区、字段冗余+属性设置

第一范式(确保每列保持原子性);
第二范式(确保表中的每列都和主键相关);
第三范式(确保每列都和主键列直接相关,而不是间接相关)。

SQL及索引:SELECT语句优化、索引、逻辑简化

MySQL 数据库铁律(小结)

系统配置和硬件

开启查询缓存

c. 一致性相关:转账、秒杀

悲观锁(Pessimistic Lock)

一锁二查三更新。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁。
需要注意的是, FOR UPDATE 生效需要同时满足两个条件时才生效:

  • 数据库的引擎为 innoDB
  • 操作位于事务块中(BEGIN/COMMIT)
set autocommit=0;  
//设置完autocommit后,我们就可以执行我们的正常业务了。具体如下:
//0.开始事务
begin;/begin work;/start transaction; (三者选一就可以)
//1.查询出商品信息 获取锁
select status from t_goods where id=1 for update;
//2.根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//3.修改商品status为2
update t_goods set status=2;
//4.提交事务 撤销锁
commit;/commit work;
乐观锁(Optimistic Lock)

实际更新数据的最后一步再去拿一下锁就好。

1. SELECT data AS old_data, version AS old_version FROM …;
2. 根据获取的数据进行业务操作,得到new_data和new_version
3. UPDATE SET data = new_data, version = new_version WHERE version = old_version
if (updated row > 0) {
    // 乐观锁获取成功,操作完成
} else {
    // 乐观锁获取失败,回滚并重试
}
借助文件排他锁
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX | LOCK_NB))
{
  //..处理订单
  flock($fp,LOCK_UN);
}
消息队列

如何实现跨行转账功能

client -- server1 -- server2

3、非技术问题

a.为什么从上家公司离职?

b.未来三年的职业规划的怎样的?

c.你有什么问的?

你可能感兴趣的:(性能优化,后端)