12 12面試題整理

2021-09-03 02:13:03 字數 3188 閱讀 8986

一直在問專案

1.自我介紹

2.介紹一下最近的乙個專案

3.你對多執行緒怎麼看

(1)發揮多核cpu的優勢多執行緒

①可以真正發揮出多核cpu的優勢來,達到充分利用cpu的目的。

(2)防止阻塞

①比方說遠端讀取某個資料吧,對端遲遲未返回又沒有設定超時時間,那麼你的整個程式在資料返回回來之前就停止執行了。多執行緒可以防止這個問題,多條執行緒同時執行,哪怕一條執行緒的**執行讀取資料阻塞,也不會影響其它任務的執行。

(3)便於建模

①假設有乙個大的任務a,單執行緒程式設計,那麼就要考慮很多,建立整個程式模型比較麻煩。但是如果把這個大的任務a分解成幾個小任務,任務b、任務c、任務d,分別建立程式模型,並通過多執行緒分別執行這幾個任務,那就簡單很多了。

4.redis的資料型別

(1)string,hash,list,set,zset,基數

5.建立執行緒的方式

①繼承thread類

②實現runnable介面

③還有一種callable介面一般不用,區別就是有返回值

至於哪個好,不用說肯定是後者好,因為實現介面的方式比繼承類的方式更靈活,也能減少程式之間的耦合度,面向介面程式設計也是設計模式6大原則的核心。

6.專案組成員

7.你對我們公司有什麼需要了解的

8.websocket和socket有什麼區別

socket其實並不是乙個協議,而是為了方便使用tcp或udp而抽象出來的一層,是位於應用層和傳輸控制層之間的一組介面。

socket是應用層與tcp/ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp/ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。

當兩台主機通訊時,必須通過socket連線,socket則利用tcp/ip協議建立tcp連線。tcp連線則更依靠於底層的ip協議,ip協議的連線則依賴於鏈路層等更低層次。

websocket則是乙個典型的應用層協議。

9.websocket和http有什麼區別

websocket同http一樣也是應用層的協議,但是它是一種雙向通訊協議,是建立在tcp之上的。

連線過程 —— 握手過程

瀏覽器、伺服器建立tcp連線,三次握手。這是通訊的基礎,傳輸控制層,若失敗後續都不執行。

tcp連線成功後,瀏覽器通過http協議向伺服器傳送websocket支援的版本號等資訊。(開始前的http握手)

伺服器收到客戶端的握手請求後,同樣採用http協議回饋資料。

當收到了連線成功的訊息後,通過tcp通道進行傳輸通訊。

websocket與http的關係

相同點都是一樣基於tcp的,都是可靠性傳輸協議。

都是應用層協議。

不同點websocket是雙向通訊協議,模擬socket協議,可以雙向傳送或接受資訊。http是單向的。

websocket是需要握手進行建立連線的。

聯絡websocket在建立握手時,資料是通過http傳輸的。但是建立之後,在真正傳輸時候是不需要http協議的。

10.你是怎麼處理秒殺業務的

優化方向有兩個(今天就講這兩個點):

(1)將請求盡量攔截在系統上游(不要讓鎖衝突落到資料庫上去)。傳統秒殺系統之所以掛,請求都壓倒了後端資料層,資料讀寫鎖衝突嚴重,併發高響應慢,幾乎所有請求都超時,流量雖大,下單成功的有效流量甚小。以12306為例,一趟火車其實只有2000張票,200w個人來買,基本沒有人能買成功,請求有效率為0。

(2)充分利用快取,秒殺買票,這是乙個典型的讀多寫少的應用場景,大部分請求是車次查詢,票查詢,下單和支付才是寫請求。一趟火車其實只有2000張票,200w個人來買,最多2000個人下單成功,其他人都是查詢庫存,寫比例只有0.1%,讀比例佔99.9%,非常適合使用快取來優化。好,後續講講怎麼個「將請求盡量攔截在系統上游」法,以及怎麼個「快取」法,講講細節。

5s只透過乙個請求,其餘的請求怎麼辦?快取,頁面快取,同乙個uid,限制訪問頻度,做頁面快取,x秒內到達站點層的請求,均返回同一頁面。同乙個item的查詢,例如車次,做頁面快取,x秒內到達站點層的請求,均返回同一頁面。如此限流,既能保證使用者有良好的使用者體驗(沒有返回404)又能保證系統的健壯性(利用頁面快取,把請求攔截在站點層了)。

頁面快取不一定要保證所有站點返回一致的頁面,直接放在每個站點的記憶體也是可以的。優點是簡單,壞處是http請求落到不同的站點,返回的車票資料可能不一樣,這是站點層的請求攔截與快取優化。

好,這個方式攔住了寫for迴圈發http請求的程式設計師,有些高階程式設計師(黑客)控制了10w個肉雞,手裡有10w個uid,同時發請求(先不考慮實名制的問題,小公尺搶手機不需要實名制),這下怎麼辦,站點層按照uid限流攔不住了。

第三層 服務層來攔截(反正就是不要讓請求落到資料庫上去)

服務層怎麼攔截?大哥,我是服務層,我清楚的知道小公尺只有1萬部手機,我清楚的知道一列火車只有2000張車票,我透10w個請求去資料庫有什麼意義呢?沒錯,請求佇列!

對於寫請求,做請求佇列,每次只透有限的寫請求去資料層(下訂單,支付這樣的寫業務)

1w部手機,只透1w個下單請求去db

3k張火車票,只透3k個下單請求去db

如果均成功再放下一批,如果庫存不夠則佇列裡的寫請求全部返回「已售完」。

對於讀請求,怎麼優化?cache抗,不管是memcached還是redis,單機抗個每秒10w應該都是沒什麼問題的。如此限流,只有非常少的寫請求,和非常少的讀快取mis的請求會透到資料層去,又有99.9%的請求被攔住了。

當然,還有業務規則上的一些優化。回想12306所做的,分時分段售票,原來統一10點賣票,現在8點,8點半,9點,…每隔半個小時放出一批:將流量攤勻。

其次,資料粒度的優化:你去購票,對於餘票查詢這個業務,票剩了58張,還是26張,你真的關注麼,其實我們只關心有票和無票?流量大的時候,做乙個粗粒度的「有票」「無票」快取即可。

第三,一些業務邏輯的非同步:例如下單業務與 支付業務的分離。這些優化都是結合 業務 來的,我之前分享過乙個觀點「一切脫離業務的架構設計都是耍流氓」架構的優化也要針對業務。

第四層 最後是資料庫層

瀏覽器攔截了80%,站點層攔截了99.9%並做了頁面快取,服務層又做了寫請求佇列與資料快取,每次透到資料庫層的請求都是可控的。db基本就沒什麼壓力了,閑庭信步,單機也能扛得住,還是那句話,庫存是有限的,小公尺的產能有限,透這麼多請求來資料庫沒有意義。

全部透到資料庫,100w個下單,0個成功,請求有效率0%。透3k個到資料,全部成功,請求有效率100%。

面試題整理

2014.3.19日整理 1.建立一張表hack 裡面就乙個欄位num,然後用sql語句從1開始插入到100,怎麼寫?oracle 答 1.create tablehack num number 建表語句 2.begin for i in1.100loop insert intohack num v...

整理面試題

整理面試題 1 說說activity,intent,service是什麼關係 答 乙個activity 通常是乙個單獨的螢幕,每乙個 activity 都被實現為乙個單獨的類,這些類都是從 activity 基類中繼承而來的。activity 類會顯示由檢視控制項組成的使用者介面,並對檢視控制項的事...

面試題整理

static變數 全域性變數與區域性變數 靜態資料區 堆疊 heap和stack的區別 堆是由malloc之類的函式分配的空間位址由低向高增長 stack是自動分配變數位址由高向低 減少程式的記憶體分配 1.棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於...