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

1 丶 Nginx 怎麼實現負載均衡mysql

這個仍是比較簡單redis

1.輪詢算法

這種是默認的策略,把每一個請求按順序逐一分配到不一樣的 server,若是 server 掛掉,能自動剔除。sql

 

 

2.最少鏈接數據庫

把請求分配到鏈接數最少的 server小程序

 

 

3.權重微信小程序

使用 weight 來指定 server 訪問比率,weight 默認是 1。如下配置會是 server2 訪問的比例是 server1 的兩倍。安全

 

 

4.ip_hash微信

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

 

 

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、RBAC一、RBAC二、RBAC3。

8 丶訂單模塊的流程

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

10 丶設置郵箱激活鏈接過時時間

在把激活碼寫入數據庫的同時寫入時間戳 + 過時時間

11 丶 Redis 與 Mongodb 的區別

1.性能

都比較高,性能對咱們來講應該都不是瓶頸。

整體來說,TPS 方面 redis 和 memcache 差很少。

2.操做的便利性

redis 在 2.0 版本後增長了本身的 VM 特性,突破物理內存的限制;能夠對 key value 設置過時時間(相似 memcache)。

mongoDB 適合大數據量的存儲,依賴操做系統 VM 作內存管理,吃內存也比較厲害,服務不要和別的服務在一塊兒。

四、可用性(單點問題)

對於單點問題:

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 的區別

一、MyISAM:默認表類型,它是基於傳統的 ISAM 類型,ISAM 是 Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫,它是存儲記錄和文件的標準方法。不是事務安全的,並且不支持外鍵,若是執行大量的 select,insert MyISAM 比較適合。

二、InnoDB:支持事務安全的引擎,支持外鍵、行鎖、事務是他的最大特色。若是有大量的 update 和 insert,建議使用 InnoDB,特別是針對多個併發和 QPS 較高的狀況。

1、表鎖差別

MyISAM:

myisam 只支持表級鎖,用戶在操做 myisam 表時,select,update,delete,insert 語句都會給表自動加鎖,若是加鎖之後的表知足 insert 併發的狀況下,能夠在表的尾部插入新的數據。也能夠經過 lock table 命令來鎖表,這樣操做主要是能夠模仿事務,可是消耗很是大,通常只在實驗演示中使用。

InnoDB :

Innodb 支持事務和行級鎖,是 innodb 的最大特點。

事務的 ACID 屬性:atomicity,consistent,isolation,durable。

併發事務帶來的幾個問題:更新丟失,髒讀,不可重複讀,幻讀。

2、數據庫文件差別

MyISAM :

myisam 屬於堆表

myisam 在磁盤存儲上有三個文件,每一個文件名以表名開頭,擴展名指出文件類型。

.frm 用於存儲表的定義

.MYD 用於存放數據

.MYI 用於存放表索引

myisam 表還支持三種不一樣的存儲格式:

靜態表 (默認,可是注意數據末尾不能有空格,會被去掉) 丶動態表丶壓縮表。

InnoDB :

innodb 屬於索引組織表

innodb 有兩種存儲方式,共享表空間存儲和多表空間存儲

兩種存儲方式的表結構和 myisam 同樣,以表名開頭,擴展名是.frm。

若是使用共享表空間,那麼全部表的數據文件和索引文件都保存在一個表空間裏,一個表空間能夠有多個文件,經過 innodb_data_file_path 和 innodb_data_home_dir 參數設置共享表空間的位置和名字,通常共享表空間的名字叫 ibdata1-n。

若是使用多表空間,那麼每一個表都有一個表空間文件用於存儲每一個表的數據和索引,文件名以表名開頭,以.ibd 爲擴展名。

3、索引差別

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 中的索引有幾種

1、普通索引

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

2、惟一索引

與普通索引相似,不一樣的是:索引的列值必須惟一,但容許有空值,也就是 null,若是是組合索引,則列值的組合必須是惟一的。

3、主鍵索引

即咱們經常使用的主鍵 id, 它是一種特殊的惟一索引,不容許有空值,通常在建表時同時建立主鍵索引。

特色:

1)一張表只有一個主鍵索引

2)主鍵要求自增

4、組合索引

即多個字段創建的索引

5、全文索引

fulltext

myisam 引擎支持

6、外鍵

創建外鍵須要注意的事項:

1)表引擎必須同樣

2)字段類型必須同樣

3)長度必須同樣

4)存儲範圍必須同樣

5)約束字段必須在被引用的字段中出現過

以上是文章所有內容,有須要學習交流的友人請加入swoole交流羣的我們一塊兒,有問題一塊兒交流,一塊兒進步!前提是你是學技術的。感謝閱讀!

點此加入該羣

相關文章
相關標籤/搜索