2018/12/11面試題整理
2018/12/11
面試題整理
今天的平安面試,1.自我介紹,2.在原崗位上是為何臨近過年離職了的?3.說一下你們最近的專案,專案結構搭建,4.專案中用到的dubbo的原理,用的是什麼協議,如何實現這個協議的,5.zookeeper是做什麼的?在哪上面會用到它,怎麼用?6.對於負載均衡你們用的哪一種?怎麼用?7.在專案中用到的MQ解釋一下什麼是MQ?在哪些地方會用到MQ?為什麼要用到MQ?有哪些好處?8.說一下Spring和SpringMVC的區別,說一下Spring的事物管理?9.說一下有哪幾種執行緒,執行緒是如何啟動的,用start啟動以後執行緒是否會立刻啟動?10.說一下hashmap集合,它是如何的一個機構?它是如何存資料的?分析一下原理?11.說一下sql優化,用過的sql索引是哪種?說一下它的底層資料結構?12.說一下redis,在什麼地方會用到它,為什麼要用到它,用到它的好處?
1.自我介紹
2.在原崗位上是為何臨近過年離職了的
3…說一下你們最近的專案,專案結構搭建
最近的一個專案是一個商場APP專案,專案是SpringBoot+Dubbo的分散式架構
主要分為後臺模組,首頁模組,購物車模組,訂單模組,支付模組,秒殺模組…
技術選型使用了Mysql資料庫,Redis快取中介軟體,RabbitMq訊息中介軟體,Tomcat伺服器
4.專案中用到的dubbo的原理,用的是什麼協議,如何實現這個協議的
dubbo的結構大致分為服務提供者,服務消費者,註冊中心,監管平臺
其中註冊中心使用的是ZooKeeper實現服務的註冊與發現,協議是ZooKeeper協議,服務的提供者在dubbo節點下建立服務節點,服務節點的consumers節點下建立臨時節點存放服務提供地址,服務的消費者在ZooKeeper中發現服務,在服務節點的Provider節點下建立臨時節點,也會存放服務節點地址但其實沒什麼實際作用,然後在將服務的消費地址返回到消費者工程中,如果是多個提供者,會返回地址列表
拿到提供者者地址資訊後就算註冊中心宕機也沒關係,服務消費者通過地址,採用Dubbo協議+netty框架RPC遠端呼叫服務消費者;建立長連線,以及使用監管中心監控
5.Zookeeper是做什麼的?
ZooKeeper在Dubbo中是用來提供命名服務的,也就是我們常說的註冊中心
ZooKeeper在其他場景下還可以有其他作用
比如統一配置檔案,叢集管理,分散式鎖等…
6.對於負載均衡你們用的哪一種?怎麼用?
service使用的是Dubbo+ZooKeeper預設的負載均衡,Controller層使用的是Nginx負載均衡進行請求分發
Zookeeper通過監管中心就可以進行修改權重,以及策略的選擇,輪詢,隨機,最小佔用
Nginx伺服器配置location / {
proxy_pass tomcatlist
}
7.在專案中用到的MQ解釋一下什麼是MQ?在哪些地方會用到MQ?為什麼要用到MQ?有哪些好處?
系統間需要非同步通訊的時候,比如商品新增的時候後臺工程需要調用搜索工程進行索引建立,商品詳情工程進行freemarker靜態頁的生成等
在訂單模組都會使用到定時功能
處理高併發場景的時候使用MQ實現請求的削峰
為什麼要用MQ?
因為分散式工程之間的通訊,不是工程內的通訊,必須通過Http請求等才能實現
對比HttpClient,MQ之間的通訊是非同步的,提高了系統內的效能,並且在降低了系統間的耦合
8.說一下Spring和SpringMVC的區別,說一下Spring的事物管理?
Spring和SpringMVC都是Spring體系下的框架,但是分工不同,Spring是貫穿表現層,控制層,服務層,資料層的一站式框架,而SpringMVC是控制層的解決方案,主要針對使用者請求以及呼叫服務層,並且Spring和SpringMVC都是IOC容器,但是存在父子容器的關係,SpringMVC中可以訪問Spring的Bean,而反過來就不可以了;
Spring的事務管理,宣告式事務主要通過三個API實現
1.平臺事務管理器
2.事務屬性
3.AOP代理
通過表示式匹配對應的方法,對對應的方法進行事務增強,AOP橫切邏輯,在進入方法前開啟事務然後在方法結束後事務關閉,如果方法出現異常,事務回滾即可
9.說一下有哪幾種執行緒,執行緒是如何啟動的,用start啟動以後執行緒是否會立刻啟動?
繼承Thread類,實現Runnable介面,實現Callable介面(有返回值)
執行緒通過start方法啟動,
執行緒會立刻啟動但是執行緒不會立刻執行,只要搶佔到cpu資源時才會執行run方法
10.說一下hashmap集合,它是如何的一個結構?它是如何存資料的?分析一下原理?
hashmap集合底層是一個雜湊表
從微觀分析這個雜湊表可以分為一個數組中儲存多個連結串列或者紅黑樹
元素儲存在hashmap中,key值會通過雜湊函式轉化為一個數組下標
如果下標中沒有元素直接儲存,如果下標中有元素,jdk1.7是放在表頭,jdk1.8是放在表尾
當連結串列的長度達到8的時候連結串列會轉換成紅黑樹,提高查詢效能
但是一般如果連結串列變成了紅黑樹這個map的查詢效率就以及很低了,需要考慮擴容打散雜湊表中的元素聚集
擴容機制
剛建立的時候擴容預設是16,最大元素數12,擴容因子0.75,是在元素插入之後擴容的
除了第一次建立,其他都是預設擴容為原來容量的兩倍,實在元素插入之前擴容的
11.說一下sql優化,用過的sql索引是哪種?說一下它的底層資料結構?
sql優化,主要從幾個方面考慮
從簡單到分庫分表
1.資料型別優化
資料型別儘量選擇小而簡單的型別即可,但是需要考慮到最大值的範圍
2.索引優化
索引優化使我們程式設計師常用的操作,通過單索引,多索引,唯一索引,覆蓋索引,聚簇索引等實現sql查詢的效能提升;
一般我是先開啟慢查詢,設定好閾值,然後先讓資料庫跑半天,然後會篩選出不達標的sql語言,在通過expire檢視sql語句的執行計劃,觀察sql_type執行順序,type執行的型別通常需要達到range級別,rows觀察表設計的行數不能太多一般上萬就需要優化,extra檢視是否使用到覆蓋索引等對sql語句建立指定索引,或者更改sql語句的結構等使得sql語句的執行效率提高
3.硬體優化
硬體方面的優化我暫時還沒有太過於研究
4.分庫分表
對mysql資料庫進行叢集搭建,使用讀寫分離中介軟體mycat
Mycat的原理中最重要的一個動詞是“攔截”,它攔截了使用者傳送過來的SQL語句,首先對SQL語句做了一些特定的分析:如分片分析、路由分析、讀寫分離分析、快取分析等,然後將此SQL發往後端的真實資料庫,並將返回的結果做適當的處理,最終再返回給使用者。
sql索引引擎innoDB
底層的資料結構是B+Tree
首先分析一下其他資料結構為什麼沒有被mysql選擇
雜湊表,單個元素查詢速度最高,但是不支援範圍查詢
二叉樹,不平衡,最差時效率和連結串列查詢速率一直
紅黑樹,雖然解決了平衡的問題,但是一旦資料量達到一定量級,會發現記憶體不夠,可能會進行大量的磁碟IO讀寫,效能大大下降
最後mysql選擇了B-Tree,一個平衡的多路數,選擇合適的度,使用分裂的方式進行大資料量的索引樹儲存
在B-Tree的基礎上升級成了B+Tree主要區別就是每一個非葉子結點都可以在葉子結點上找到,並且葉子結點之間兩兩相連線
12.說一下redis,在什麼地方會用到它,為什麼要用到它,用到它的好處?
redis的主要應用場景有很多
1.也是最常見的應用場景-資料快取伺服器,專門為程式提供臨時資料快取的功能,避免了請求到達底層儲存系統,大幅度提高了伺服器響應的資料
2.應對高速讀寫的場景,面對高速讀寫的場景,常會發生高併發問題,使用redis底層是單程序的特性結合lua指令碼對業務邏輯進行原子性操作實現了資料的一致性並且redis處理資料的能力遠遠高於傳統的關係型資料庫
3.分散式鎖
上面說了高併發問題,通過redis單程序的特性
分散式系統或者叢集環境下,某些同步業務方法,無法再有效的保證業務安全,因為當前工程的同步關鍵字不能鎖住其他工程的執行緒,因此完全有可能有幾個執行緒進行相關的業務操作;這時候,他們可以通過redis分散式鎖讓不同的工程區同一個地方加鎖,從而保證只有一個執行緒在進行業務操作,保證執行緒安全
4.資料共享
實現SSO單點登入,使用redis作為快取資料伺服器,各個系統都訪問redis獲取使用者資訊,起到session的作用,在使用Cookie儲存令牌,實現使用者資料共享,進而實現SSO單點登入
在分散式叢集環境下,有些資料如果放在session中,那麼會導致其他的tomcat伺服器無法訪問這個資料,這樣使用者就會發現資料的展示時有時無;通常來說,這些資料就需要進行共享處理,redis就可以充當資料共享的伺服器
5.訊息的訂閱和釋出(不常用的場景),比較與MQ產品,redis基於記憶體,資料是輕量級的,只能進行一些簡單的資料傳遞;