(思惟進階)3、性能優化面試

一、出現性能瓶頸如何定位解決

a. 分析硬件資源佔用

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

ps -aux中(a指代all——全部的進程,u指代userid——執行該進程的用戶id,x指代顯示全部程序,不以終端機來區分)php

檢查數據庫網絡延遲

ping xxhtml

b. 代碼性能分析工具

xphrof|php7tideways_xhprof -- 主動性能分析

安裝Tideways和Toolkit對PHP代碼進行性能分析git

swoole-tracker 能夠監測php-fpm

swoole-tracker安裝客戶端github

c. 優化方案

使用緩存


PHP緩存工具
yac是用於PHP的快速,無鎖的共享內存用戶數據緩存。它能夠用來代替APC或本地memcached。正則表達式

使用php內置函數


php數組函數
array_merge 若是兩個或更多個數組元素有相同的鍵名,則最後的元素會覆蓋其餘元素
array_reduce(array,myfunction,initial) 函數發送數組中的值到用戶自定義函數,並返回一個字符串數據庫

isset 語言構造器:isset()會同時檢查鍵和值,只有當健存在,對應的變量不爲NUll的時候纔會返回TURE
array_key_exists 函數:這個函數會返回TRUE,只要鍵值存在,即便值爲NULLsegmentfault

使用PHP擴展

經過php擴展替代高頻邏輯跨域

d. 平常代碼規範化注意事項

來源數組

減小使用PHP魔法函數
合理使用內存unset
正則表達式
避免在循環中作運算
減小計算密集型業務

二、筆試題

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

三、非技術問題

a.爲何從上家公司離職?

b.將來三年的職業規劃的怎樣的?

c.你有什麼問的?

相關文章
相關標籤/搜索