《2019年小米春季上海 PHP 實習生招聘面試題》部分答案解析 [ 千人千面 ]

NiZerin發表於2019-01-06

1丶Nginx怎麼實現負載均衡

這個還是比較簡單

1、輪詢

這種是預設的策略,把每個請求按順序逐一分配到不同的server,如果server掛掉,能自動剔除。

upstream  fengzp.com {   
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}

2、最少連線

把請求分配到連線數最少的server

upstream  fengzp.com {   
    least_conn;
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}

3、權重

使用weight來指定server訪問比率,weight預設是1。以下配置會是server2訪問的比例是server1的兩倍。

upstream  fengzp.com {   
    server   192.168.99.100:42000 weight=1; 
    server   192.168.99.100:42001 weight=2;  
}

4、ip_hash

每個請求會按照訪問ip的hash值分配,這樣同一客戶端連續的Web請求都會被分發到同一server進行處理,可以解決session的問題。如果server掛掉,能自動剔除。

upstream  fengzp.com {   
    ip_hash;
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}

ip_hash可以和weight結合使用。

2丶Linux常用的命令

這個就不多說了

3丶微信小程式常用的元件

view丶text丶button丶navigator丶scroll-view......等等

4丶Nginx怎麼配置虛擬主機

恩2333333

5丶TP5和Laravel框架差異

恩2333333

6丶TP5和Laravel框架中的資料遷移

這個本社群就有文件的

7丶RBAC模型的講解

什麼是RBAC

RBAC(基於角色的訪問控制):英文名稱 Rose base Access Controller 。本部落格介紹這種模型的許可權系統設計。取消了使用者和許可權的直接關聯,改為通過使用者關聯角色、角色關聯許可權的方法來間接地賦予使用者許可權。從而實現瞭解耦。RBAC在發展過程中分為以下幾個版本。RBAC0、RBAC1、RBAC2、RBAC3。

8丶訂單模組的流程

9丶訂單支付成功後的操作

10丶設定郵箱啟用連線過期時間

在把啟用碼寫入資料庫的同時寫入時間戳+過期時間

11丶Redis與Mongodb的區別

1、效能

都比較高,效能對我們來說應該都不是瓶頸。
總體來講,TPS方面redis和memcache差不多。

2、操作的便利性

redis在2.0版本後增加了自己的VM特性,突破實體記憶體的限制;可以對key value設定過期時間(類似memcache)。
mongoDB適合大資料量的儲存,依賴作業系統VM做記憶體管理,吃記憶體也比較厲害,服務不要和別的服務在一起。

4、可用性(單點問題)

對於單點問題:
redis,依賴客戶端來實現分散式讀寫;主從複製時,每次從節點重新連線主節點都要依賴整個快照,無增量複製,因效能和效率問題,所以單點問題比較複雜;不支援自動sharding,需要依賴程式設定一致hash 機制。
一種替代方案是,不用redis本身的複製機制,採用自己做主動複製(多份儲存),或者改成增量複製的方式(需要自己實現),一致性問題和效能的權衡。
mongoDB支援 master-slave,replicaset (內部採用paxos選舉演算法,自動故障恢復),auto sharding機制,對客戶端遮蔽了故障轉移和切分機制。

5、可靠性(持久化)

對於資料持久化和資料恢復,redis支援(快照、AOF):依賴快照進行持久化,aof增強了可靠性的同時,對效能有所影響,MongoDB從1.8版本開始採用binlog方式支援持久化的可靠性。

6、資料一致性(事務支援)

redis事務支援比較弱,只能保證事務中的每個操作連續執行,mongoDB不支援事務。

7、應用場景

redis:資料量較小的更效能操作和運算上
MongoDB:主要解決海量資料的訪問效率問題

12丶redis和memcached的區別

13丶redis中的佇列

關於redis佇列的實現方式有兩種:

1、生產者消費者模式。

普通版本:

比如一個佇列裡面,生產者A push了一個資料進去,消費者B pop 了這個資料,那個這個佇列依舊為空。所以是一對一的。
至於是先進先出還是先進後出等,可以依照函式lpush(從佇列左邊,也就是隊首push一個資料) rpush(從佇列右邊也就是隊尾push一個資料) lpop(同理) rpop等來控制。

阻塞版本:

但是上面的命令都是立即返回的,無論資料有無,關於取資料lpop有個增強版本,blpop(block left pop)阻塞版本,
使用方法:blpop key1 key2 ... keyn 10
同時預獲取多個key的值,並設定超時時間為10s,如果所有key,有些key有value就立即返回,如果所有key都沒有value就阻塞10秒返回

2、釋出者訂閱者模式。

概念:

三個使用者A,B,C同時都訂閱了一個channel名字叫msg,然後釋出者往msg的channel裡面釋出了一個資料,那麼A,B,C三個使用者都會收到該資料。

注意點:

很明顯,三個使用者ABC需要阻塞。怎麼收到訂閱的資料呢,肯定是依靠註冊在redis裡面的回撥函式。
釋出的資料不會在redis裡面復現,意思就是釋出了以後,A,B,C由於種種原因沒收到就沒收到。

14丶redis中的資料型別

Redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。

15丶TP框架中的事件

16丶TP框架的依賴注入

和Laravel沒什麼區別

17丶MySQL的讀寫分離操作

什麼主從複製,什麼bin log,胡說了一大堆

18丶資料庫varchar和char的區別

varchar會回收未使用的空間

19丶MyIsam與InnoDB的區別

1、MyISAM:預設表型別,它是基於傳統的ISAM型別,ISAM是Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫,它是儲存記錄和檔案的標準方法。不是事務安全的,而且不支援外來鍵,如果執行大量的select,insert MyISAM比較適合。
2、InnoDB:支援事務安全的引擎,支援外來鍵、行鎖、事務是他的最大特點。如果有大量的update和insert,建議使用InnoDB,特別是針對多個併發和QPS較高的情況。

一、表鎖差異

MyISAM:

myisam只支援表級鎖,使用者在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以後的表滿足insert併發的情況下,可以在表的尾部插入新的資料。也可以通過lock table命令來鎖表,這樣操作主要是可以模仿事務,但是消耗非常大,一般只在實驗演示中使用。

InnoDB :

Innodb支援事務和行級鎖,是innodb的最大特色。
事務的ACID屬性:atomicity,consistent,isolation,durable。
併發事務帶來的幾個問題:更新丟失,髒讀,不可重複讀,幻讀。

二、資料庫檔案差異

MyISAM :

myisam屬於堆表
myisam在磁碟儲存上有三個檔案,每個檔名以表名開頭,副檔名指出檔案型別。
.frm 用於儲存表的定義
.MYD 用於存放資料
.MYI 用於存放表索引
myisam表還支援三種不同的儲存格式:
靜態表(預設,但是注意資料末尾不能有空格,會被去掉)丶動態表丶壓縮表。

InnoDB :

innodb屬於索引組織表
innodb有兩種儲存方式,共享表空間儲存和多表空間儲存
兩種儲存方式的表結構和myisam一樣,以表名開頭,副檔名是.frm。
如果使用共享表空間,那麼所有表的資料檔案和索引檔案都儲存在一個表空間裡,一個表空間可以有多個檔案,通過innodb_data_file_pathinnodb_data_home_dir 引數設定共享表空間的位置和名字,一般共享表空間的名字叫ibdata1-n。
如果使用多表空間,那麼每個表都有一個表空間檔案用於儲存每個表的資料和索引,檔名以表名開頭,以.ibd為副檔名。

三、索引差異

1、關於自動增長

myisam引擎的自動增長列必須是索引,如果是組合索引,自動增長可以不是第一列,他可以根據前面幾列進行排序後遞增。
innodb引擎的自動增長咧必須是索引,如果是組合索引也必須是組合索引的第一列。

2、關於主鍵

myisam允許沒有任何索引和主鍵的表存在,
myisam的索引都是儲存行的地址。
innodb引擎如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6位元組的主鍵(使用者不可見)
innodb的資料是主索引的一部分,附加索引儲存的是主索引的值。

3、關於count()函式

myisam儲存有表的總行數,如果 select count(*) from table; 會直接取出出該值
innodb沒有儲存表的總行數,如果使用 select count(*) from table; 就會遍歷整個表,消耗相當大,但是在加了where 條件後,myisam和innodb處理的方式都一樣。

4、全文索引

myisam支援 FULLTEXT型別的全文索引
innodb不支援FULLTEXT型別的全文索引(5.6開始已經支援了),但是innodb可以使用sphinx外掛支援全文索引,並且效果更好。(sphinx 是一個開源軟體,提供多種語言的API介面,可以優化mysql的各種查詢)。

5、delete from table

使用這條命令時,innodb不會從新建立表,而是一條一條的刪除資料,在innodb上如果要清空儲存有大量資料的表,最 好不要使用這個命令。(推薦使用truncate table,不過需要使用者有drop此表的許可權)。

6、索引儲存位置

myisam的索引以表名+.MYI檔案分別儲存。
innodb的索引和資料一起儲存在表空間裡。

20丶MySQL中的索引有幾種

一、普通索引

最基本的索引,只是加快了查詢速度。

二、唯一索引

與普通索引類似,不同的是:索引的列值必須唯一,但允許有空值,也就是null,如果是組合索引,則列值的組合必須是唯一的。

三、主鍵索引

即我們常用的主鍵id,它是一種特殊的唯一索引,不允許有空值,一般在建表時同時建立主鍵索引。
特點:

1)一張表只有一個主鍵索引
2)主鍵要求自增

四、組合索引

即多個欄位建立的索引

五、全文索引

fulltext
myisam引擎支援

六、外來鍵

建立外來鍵需要注意的事項:

1)表引擎必須一樣
2)欄位型別必須一樣
3)長度必須一樣
4)儲存範圍必須一樣
5)約束欄位必須在被引用的欄位中出現過

By: Laravel-China 寧澤林
MyBlog: nizer.in

相關文章