百度雲Java社招技術3面面經總結:Java併發+Redis+數據庫+分佈式

轉載於:https://www.nowcoder.com/discuss/357511


百度雲Java社招技術3面面經總結:Java併發+Redis+數據庫+分佈式

百度雲java社招一面面經與個人總結(文末附學習面經筆記)

1.首先是項目部分,問的比較細。這部分沒什麼參考價值,忽略。

2.如果一個對象有多個方法加了synchronized,那麼該對象有幾把鎖

對象鎖是在一個類的對象上加的的鎖,只有一把,不管有幾個方法進行了同步。

這些同步方法都共有一把鎖,只要一個線程獲得了這個對象鎖,其他的線程就不能訪問該對象的任何一個同步方法。

3.NIO與AIO的區別以及各自的作用

Java NIO :同步非阻塞,服務器實現模式為一個請求一個線程,即客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有I/O請求時才啟動一個線程進行處理。

Java AIO(NIO.2) : 異步非阻塞,服務器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理。

NIO方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器。

AIO方式使用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器。

4.IOC的實現原理

Spring的IOC實現原理就是工廠模式加反射機制,通俗來講就是根據給出的類名(字符串方式)來動態地生成對象,這種編程方式可以讓對象在生成時才被決定到底是哪一種對象。

把IOC容器的工作模式看做是工廠模式的昇華,可以把IOC容器看作是一個工廠,這個工廠裡要生產的對象都在配置文件中給出定義,然後利用編程語言提供的反射機制,根據配置文件中給出的類名生成相應的對象。

Spring支持三種依賴注入方式,分別是屬性(Setter方法)注入,構造注入和接口注入。

5、反射的原理

反射首先是能夠獲取到Java中的反射類的字節碼,然後將字節碼中的方法,變量,構造函數等映射成 相應的 Method、Filed、Constructor 等類

6、數據庫調優思路的思路。

1)慢查詢的開啟並捕獲2)explain+慢sql分析3)show profile查詢sql在mysql服務器裡面的執行細節和生命週期情況4)sql數據庫服務器的參數調優

7、開放性的問題,如何提高系統QPS。

這個問題我感覺大致可以從這幾個方面1)單機版能承受併發的能力是有限的,我們可以進行系統拆分,分開部署在不同的機器上。2)用消息隊列削峰。系統不至於因為瞬間的流量掛掉。並且可以配合使用限流與服務降級。3)用redis什麼的做緩存。4)數據庫分庫分表,建立合適的索引。

百度雲java社招二面面經與個人總結

首先還是懟項目。問的比較細,有時候面試官會把條件改下,問假如現在需要你實現這個功能,你怎麼來實現? 中間也會穿插一些中間件和基礎原理的問題。

1.redis做分佈式鎖怎麼做的?

先拿setnx來爭搶鎖,搶到之後,再用expire給鎖加一個過期時間防止由於程序crash等原因沒有釋放。最後線程操作結束之後,釋放分佈式鎖。

2.Redis能做分佈式鎖的原理?

Redis為單進程單線程模式,採用隊列模式將併發訪問變成串行訪問,且多客戶端對Redis的連接並不存在競爭關係。

3.JUC下面主要用哪些東西?

CountDownLatch、Cyclicbarrier 。。。。。等等。其核心是AQS

4.說一下AQS?

AQS是JUC中很多同步組件的構建基礎,簡單來講,它內部實現主要是狀態變量state和一個FIFO隊列來完成,同步隊列的頭結點是當前獲取到同步狀態的結點,獲取同步狀態state失敗的線程,會被構造成一個結點(或共享式或獨佔式)加入到同步隊列尾部(採用自旋CAS來保證此操作的線程安全),隨後線程會阻塞;釋放時喚醒頭結點的後繼結點,使其加入對同步狀態的爭奪中。



5.說下MVCC?數據庫調優的思路?

在讀已提交的級別下,都會通過MVCC獲取當前數據的最新快照,不加任何鎖。存在的問題:在每次select之間有其他事務更新了我們讀取的數據並提交了,那就出現了不可重複讀。可重複讀:MVCC版本的生成時機, 即:一次事務中只在第一次select時生成版本,後續的查詢都是在這個版本上進行,從而實現了可重複讀。

1.慢查詢的開啟並捕獲

2.explain+慢sql分析

3.show profile查詢sql在mysql服務器裡面的執行細節和生命週期情況

.sql數據庫服務器的參數調優。


6.kafka怎麼保證消息的順序性?zookeeper的選舉原理?

百度雲java社招三面面經與個人總結

畫項目架構圖,講項目流程,及解決問題思路

1、redis分佈式鎖如何保證原子性?

可以瞭解下這個命令:set key value [EX seconds] [PX milliseconds] [NX|XX]

2、用過ThreadLocal嗎?簡單說一下?

ThreadLocal採用的是以空間換時間的方式,為每個線程提供一份變量副本。每一個線程都可以獨立的改變自己的副本。具體例子可以自己去網上找。

3、Java8之後的ConcurrentHashMap, 捨棄分段鎖

通過 JDK 的源碼和官方文檔看來, 他們認為的棄用分段鎖的原因由以下幾點:

1.加入多個分段鎖浪費內存空間。

2.生產環境中, map 在放入時競爭同一個鎖的概率非常小,分段鎖反而會造成更新等操作的長時間等待。

3.為了提高 GC 的效率。

4、介紹下cms收集器

CMS收集器是老年代收集器,可以配合新生代的Serial和ParNew收集器一起使用。使用的是標記清除算法,容易產生內存碎片。4個步驟: 1.初始標記--》併發標記--》重新標記--》併發清除 (初始標記、重新標記)仍需STW。但初始標記僅僅只標記了一下GC Roots能直接關聯到的對象,速度很快。而重新標記則是修正併發標記期間因用戶程序繼續運行而導致標記產生變動的那一部分對象的標記記錄,雖然一般比初始標記階段稍長,但要遠小於併發標記時間。

5、redis緩存與數據庫一致性問題?

一致性問題主要出現在數據更新的時候,通常在更新時採取刪除緩存而不是更新緩存。

具體一點?先淘汰緩存,再寫數據庫。因為如果先寫數據庫可能出現如果有讀請求發生,可能導致舊數據入緩存,引發數據不一致。

6、dubbo有哪幾種負載均衡策略?

1.RandomLoadBalance:按權重隨機調用,這種方式是dubbo默認的負載均衡策略2.RoundRobinLoadBalance:輪詢,按公約後的權重設置輪詢比率3.LeastActiveLoadBalance:最少活躍次數4.ConsistentHashLoadBalance:一致性hash5.自定義負載均衡策略

7、介紹下一致性hash?

先說下普通hash有機器宕機或者新加機器的後果。然後介紹一致性hash。hash值是個整數非負數值,所有的hash值形成一個閉圓環對集群的的節點的某個屬性求hash值,放到環上數據key求hash值,也放到環上。數據的hash值按順時針找到離它最近的節點,放在該節點上。

8、介紹下mysql的回表和覆蓋索引?

回表簡單來說就是數據庫根據索引(非主鍵)找到了指定記錄所在行後,還需要根據主鍵再次到數據庫裡獲取數據。如果一個索引包含(或覆蓋)所有需要查詢的字段的值,稱為‘覆蓋索引’。即只需掃描索引而無須回

9.分庫分表有哪些方式講一下?mycat知道嗎?

10.使用過哪些Nosql

11.mapreduce簡要介紹下?大概說了下原理。

12.redis中有哪些基本數據結構?redis持久化的設計?

13.redis有哪些集群方案?

14.你有什麼問題要問我嗎?

面試總結:

  1. java的基礎知識點,主要圍繞在集合類和多線程等:ArrayList、LinkedList、HashSet、HashpMap的數據結果,以及如何擴容、以及ConcurrentHashMap相關的多線程安全等。
  2. JVM的內存分配、幾個常見的垃圾回收算法以及原理、還有對應的JVM優化參數需要牢記。
  3. 網絡:TCP的三次握手等網絡都必問,重點掌握網絡協議。
  4. Redis:作為分佈式緩存的主力,基本也是BAT每次必考,重點是Redis的數據結構、內存、算法、持久化,以及與別的緩存memcached的優劣勢。
  5. 多線程:狀態流轉、多線程的實現,以及與高併發的區別等。
  6. Spring框架問得是最多的,BAT非常喜歡問,重點掌握。
  7. 最後就是分佈式架構設計

“做程序員,圈子和學習最重要”因為有有了圈子可以讓你少走彎路,擴寬人脈,擴展思路,學習他人的一些經驗及學習方法!同時在這分享一下一直以來整理的Java後端進階筆記文檔和學習資料免費分享給大家!

資料免費領取:轉發後關注我私信回覆關鍵詞【面試】即可獲取資料免費領取方式!

Java後端面試專題文檔

百度雲Java社招技術3面面經總結:Java併發+Redis+數據庫+分佈式

Java後端面試高頻題視頻講解

百度雲Java社招技術3面面經總結:Java併發+Redis+數據庫+分佈式

Java虛擬機(JVM)及性能優化

百度雲Java社招技術3面面經總結:Java併發+Redis+數據庫+分佈式

Redis學習經驗筆記

百度雲Java社招技術3面面經總結:Java併發+Redis+數據庫+分佈式

MySQL高性能數據庫

百度雲Java社招技術3面面經總結:Java併發+Redis+數據庫+分佈式

設計模式

百度雲Java社招技術3面面經總結:Java併發+Redis+數據庫+分佈式


分享到:


相關文章: