Java編程筆試面試題⑥

上期題目解答:

1.常用中間件RabbitMQ,kafka等,原理、區別、優缺點。

RabbitMQ是一個AMQP實現,傳統的messaging queue系統實現,基於Erlang。老牌MQ產品了。AMQP協議更多用在企業系統內,對數據一致性、穩定性和可靠性要求很高的場景,對性能和吞吐量還在其次。

Kafka是linkedin開源的MQ系統,主要特點是基於Pull的模式來處理消息消費,追求高吞吐量,一開始的目的就是用於日誌收集和傳輸,0.8開始支持複製,不支持事務,適合產生大量數據的互聯網服務的數據收集業務。

2.Lock 和 synchronize 實現原理與區別。簡述樂觀鎖悲觀鎖。分佈式鎖實現方式

synchronized是託管給JVM執行的,而lock是java寫的控制鎖的代碼。synchronized在鎖定時如果方法塊拋出異常,JVM 會自動將鎖釋放掉,不會因爲出了異常沒有釋放鎖造成線程死鎖。

但是 Lock 的話就享受不到 JVM 帶來自動的功能,出現異常時必須在 finally 將鎖釋放掉,否則將會引起死鎖。在資源競爭不是很激烈的情況下,偶爾會有同步的情形下,synchronized是很合適的。原因在於,編譯程序通常會儘可能的進行優化synchronize。

分佈式鎖實現方式:基於數據庫實現,基於緩存(Redis,memcached,tair)實現,基於Zookeeper實現。

3.Redis和memcache區別

Memcached和Redis都能很好的滿足解決我們的問題,它們性能都很高,總的來說,可以把Redis理解爲是對Memcached的拓展,是更加重量級的實現,提供了更多更強大的功能。具體來說:

a.性能上:

性能上都很出色,具體到細節,由於Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis最近也在存儲大數據的性能上進行優化,但是比起 Memcached,還是稍有遜色。

b.內存空間和數據量大小:

MemCached可以修改最大內存,採用LRU算法。

Redis增加了VM的特性,突破了物理內存的限制。

c.操作便利上:

MemCached數據結構單一,僅用來緩存數據

Redis支持更加豐富的數據類型,也可以在服務器端直接對數據進行豐富的操作,這樣可以減少網絡IO次數和數據體積。

d.可靠性上:

MemCached不支持數據持久化,斷電或重啓後數據消失,但其穩定性是有保證的。

Redis支持數據持久化和數據恢復,允許單點故障,但是同時也會付出性能的代價。

e.應用場景:

Memcached:動態系統中減輕數據庫負載,提升性能;做緩存,適合多讀少寫,大數據量的情況(如人人網大量查詢用戶信息、好友信息、文章信息等)。

Redis:適用於對讀寫效率要求都很高,數據處理業務複雜和對安全性要求較高的系統(如新浪微博的計數和微博發佈部分系統,對數據安全性、讀寫要求都很高)。

今日題目:大數據方向 難度指數:★★

1.給定a、b兩個文件,各存放50億個url,每個url各佔64字節,內存限制是4G,讓你找出a、b文件共同的url?

2.有10個文件,每個文件1G,每個文件的每一行存放的都是用戶的query,每個文件的query都可能重複。要求你按照query的頻度排序。

3.有一個1G大小的一個文件,裏面每一行是一個詞,詞的大小不超過16字節,內存限制大小是1M。返回頻數最高的100個詞。

4.海量日誌數據,提取出某日訪問百度次數最多的那個IP。

備註:以上題目只需給出方案即可,不需要具體實現

書籍推薦:入門級 難度指數:★★★

Head First Java

Java學習筆記

Java核心技術:卷1 基礎知識

Java從入門到精通

瘋狂Java講義

Head First Servle&JSP

JSP & Servlet學習筆記

編寫高質量代碼——改善Java程序的151個建議

Java程序員修煉之道

Java8實戰

有效的單元測試

Java核心技術:卷2 高級特性

代碼整潔之道

數據結構與算法分析-Java語言描述

相關文章