2019java開發面試問答合集(附答案)

10G整數文件中尋找中位數或者第K大數

採用基於字節的桶排序將數字分到不同的桶中,比如找到第k大數,則先找出每個桶中的第k大數,在比較。
整形是4byte,有32位,先按高八位建255個桶
如果內存只有2g,則每次讀取2g的數據遍歷放到255個桶中,並統計255個桶的量,2g讀取完後將每個桶的數據導出到磁盤,循環讀完10g數據。
這時根據255個桶的計數計算出中位數在哪個桶,然後開始建後續8位的桶,直到最後低8位也分完,這時候對桶內數據進行快排即可。
如何實現分佈式鎖

數據庫樂觀鎖,利用了mysql update行鎖的特點,在每次update前先select出數據然後根據數據的版本進行update,如果版本變了就不更新並把錯誤拋給用戶重試最終達到一致。
redis setnx,當該key不存在時就設置value,如果已經存在該key了就直接返回。
zookeeper 不能重複創建同一個節點,創建持久結點時需要主動刪除結點釋放,創建臨時結點時斷開連接就會釋放
什麼是分佈式系統,分佈式原理是什麼

將一個大的系統拆分成多個細小的子系統,子系統之間通過網絡通信的構成的大系統稱爲分佈式系統。

分佈式事務怎麼做

事務有四個特性acid

a:原子性,事務中的操作不可分割,要麼一起成功,要麼一起失敗
c: 一致性,數據庫中的數據要是完整的,也包含各資源狀態的一致
i:隔離性,事務之間要有自己的工作空間,不能相互干擾
d:持久性,事務完成後數據要落盤
數據庫的事務是使用undo和redo日誌做的,undo會記錄未提交操作的數據用來回滾,redo記錄已提交操作的數據落盤。
常用的分佈式事務有幾種方式:

2pc,兩階段提交,服務a發prepare請求給協調器,協調器將請求寫到本地日誌,然後發送prepare給其他各服務,執行者收到請求後執行本地事務,但不會commit,然後將結果返回給協調器,協調器判斷所有的返回如果都成功則讓所有執行者提交commit,如果有失敗的則全部回滾。
消息表,服務a在發起事務的時候執行本地事務的消息同時寫入消息表然後發送消息給服務b,服務b在完成本地事務後回消息給服務a調度器清除消息表,如果沒有清除,則事務調度器讀取消息表發送消息給服務b,這就需要服務b有冪等性
消息事務,消息事務是通過消息中間件實現的類似2pc功能比如rocketmq,服務a提交prepare給mq,然後執行本地事務,如果失敗則回滾,如果成功則確認prepare消息,mq相當於事務調度器會定期掃描prepare消息詢問發送方是否要發送消息,而消費方如果失敗則需要一直重試
TCC事務補償,先鎖住資源,然後使用鎖住的資源執行業務邏輯,如果失敗則釋放資源,如果成功則落盤。
分佈式cap,base理論

分佈式系統的cap理論,c一致性,a可用性,p分區容錯性,因爲網絡和機器原因不可控所以p是一定要保障的,大家都知道cap不能同時滿足,所以只能在c和a中選擇,因此有base理論,ba基本可用,s軟狀態(在最終一致前允許存在不一樣的狀態),e最終一致

zookeeper

使用場景

配置管理,由於強一致性,可以存放集羣配置
集羣管理,有新機器加入時在指定目錄創建臨時znode,然後集羣所有機器對目錄創建watch,當有機器斷連時臨時znode會自動刪除,集羣機器收到通知
分佈式鎖,集羣機器同時創建znode,創建成功的搶到鎖,zonde刪除釋放鎖
隊列,採用編號znode,按照編號順序依次執行
集羣

集羣中有三種角色,leader,follower和observer,leader負責寫操作,保證集羣事務的順序性,follower參與選舉,observer負責讀操作。只有當集羣初始化和領導者失去多數派支持時會發生領導者選舉。

原理

zookeeper的核心是原子廣播,採用zab協議,主要有恢復模式(選主)和廣播模式(同步)

如何批量替換文本中的字符串

sed -i "s/x/y/g" *
一個文件中可以使用vim
tr命令替換
aws gsub函數
常用的查看cpu,內存,網絡,磁盤的命令有哪些

top
查看cpu命令:mpstat
查看內存:free
查看網絡:netstat lsof查看端口,統計句柄
查看磁盤:df du fdisk
nginx

proxy_pass和rewrite的區別

proxy_pass請求在後臺跳轉,不影響瀏覽器url
rewrite會發起3xx請求,影響瀏覽器url
nginx和tomcat的區別

nginx是http server,常用做靜態內容服務和代理服務器,直接外來請求轉發給後面的應用服務器(tomcat,Django等)
tomcat是一個application server,更準確的說是一個servlet/jsp應用的容器,處理http請求並生成動態頁面。
正向代理和反向代理

正向代理代理的是客戶端,服務端不知道真正的客戶端是誰,場景如vpn
反向代理代理的是服務端,客戶端不知道真正的服務端是誰,場景如負載均衡
DNS

域名正向解析和反向解析

正向解析是指根據域名找到ip地址
反向解析是根據ip地址找到域名,通常用來屏蔽某個ip上的域名或者郵件
一個域名解析的過程

客戶向本地dns服務器發起請求,本地dns服務器一層一層向上遞歸查詢是否有域名解析,直到根服務器
根服務器返回頂級域的dns服務器地址給本地服務器,本地服務器迭代查詢:根-頂級域-二級域-三級域,直到某個域服務器返回地址給本地服務器,本地服務器緩存該解析,然後返回給客戶端
網絡

tcp/ip協議,三次握手,四次揮手

三次握手

客戶端發起請求,發送syn報文,seq=x
服務端收到syn請求後,返回ack,此時ack=x+1,然後也返回一個syn,seq=y
客戶端收到syn後,返回ack,此時ack=y+1,連接建立
四次揮手

客戶端發起請求,發送fin報文,seq=x
服務端收到fin報文後,返回ack,此時ack=x+1,此步驟確認客戶端已不會發送數據,但是服務端數據可能沒有返回
服務端確認數據全部返回後,發送fin報文,seq=y,告訴客戶端已處理完,可以關閉
客戶端返回ack=y+1,關閉連接
snat 和 dnat

內網機器要訪問外網,需要snat,防火牆修改來源ip爲公網出口ip發送請求包給外網,外網機器接收到的請求包的來源是公網出口ip而不是真正的內網ip
外網訪問內網機器,需要dnat,外網發送請求包目標地址是公網出口ip,防火牆根據路由修改請求包的目標爲內網ip發送給內網機器,內網機器返回時防火牆修改源地址爲公網出口ip返回給外網機器
docker

什麼是docker容器,什麼是docker鏡像

Docker鏡像用於創建容器。使用build命令創建鏡像,並且在使用run啓動時它們將生成容器。
Docker容器包括應用程序及其所有依賴項,但與其他容器共享內核,作爲主機操作系統上用戶空間中的獨立進程運行。
docker run和docker start有什麼區別

docker run = 創建容器docker create + 啓動容器docker start

docker file COPY 和 ADD的區別

COPY指令能夠將構建命令所在的主機本地的文件或目錄,複製到鏡像文件系統。
ADD指令不僅能夠將構建命令所在的主機本地的文件或目錄,而且能夠將遠程URL所對應的文件或目錄,作爲資源複製到鏡像文件系統,還可以解壓壓縮文件並把它們添加到鏡像中。
如何縮小docker鏡像的體積

儘量在同一層運行更多的命令
由於copy,add,run都會生成新的層,儘量使用run命令執行copy和add,如wget
移除編譯打包依賴
使用小體積的 Alpine 基礎鏡像
docker的網絡模式

host模式

和宿主機共用網絡namesapce,端口直接使用宿主機的端口

other container模式

和host模式很像,只是共用的是另一個容器的網絡namespace

需要java學習路線圖的私信筆者“java”領取哦!另外喜歡這篇文章的可以給筆者點個贊,關注一下,每天都會分享Java相關文章!還有不定時的福利贈送,包括整理的學習資料,面試題,源碼等~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章