寫這篇主要是想復(fù)盤一下我的兩次面試經(jīng)歷,一個是B站的后端開發(fā)崗,另一個是百度的搜索研發(fā)。文章涵蓋了MySQL、Golang、 計算機(jī)網(wǎng)絡(luò)、Elasticsearch、 分布式、搜索的一些知識。
作者:郁南
1.你之前是負(fù)責(zé)搜索的,那我想聽一下你們搜索系統(tǒng)的大致流程
說實在還挺驚訝面試官會問這個的,因為對方是一個后端工程師,所以就沒講多細(xì)致,答得很general,大體來說就是,query分析->粗排召回->精排算特征-> learning to rank計算score ->返回結(jié)果,每個再展開來說一些即可。面試官問這個相當(dāng)于在問項目,確定簡歷的真實性,所以這個沒啥參考價值。
2.MySQL的事務(wù)隔離級別有哪些?
總共是四大隔離級別,理解以后用自己的話答就好了
面試官還是比較滿意這個答案的,但接下來面試官問道:
3.以上事務(wù)隔離是如何實現(xiàn)的?
老實回答,這題我不會,面試官提示MVCC,我還是不會hhh?;厝シ艘恍┵Y料,在這里補(bǔ)充一下答案。所謂的MVCC就是MultipleVersion Concurrency Control,多版本并發(fā)控制,從名字上也可以看出來,它是使用版本號來對數(shù)據(jù)進(jìn)行并發(fā)控制的。實際上,在數(shù)據(jù)表的每一列,都存儲兩個隱藏列,一個是trx_id,代表事務(wù)的ID,另一個是roll_pointer,指向其上一個版本的記錄,如此組成一個記錄的版本鏈,接下來就可以講ReadView了,它存儲著一種用來記錄當(dāng)前活躍狀態(tài)的讀寫事務(wù),用于判定該transaction可見到的數(shù)據(jù)版本。
4.MySQL索引的原理是什么?
B+樹,本質(zhì)上它是將瘦長的平衡二叉樹,改造成一個矮扁的平衡多叉樹從而減少IO查詢次數(shù),平均查詢復(fù)雜度仍能保證O(logN),另外與B樹不同的是,除了葉子結(jié)點外,其他結(jié)點均不存儲數(shù)據(jù),另外葉子結(jié)點之間,用鏈表方式相連以加速查詢。當(dāng)然視面試官的反應(yīng),可以再補(bǔ)充B+樹的插入和刪除操作。
5.MySQL建立索引時,應(yīng)該注意什么?
這個按照自己的經(jīng)驗來回答了,三點:1.對區(qū)分度高的列做索引, 對于那種只有兩三個值得索引并沒有多大意義。2.建立聯(lián)合索引時要滿足最左匹配原則,例如SELECT * FROM TABLE WHERE A=1 AND B=2 AND C=3,此時需要對ABC建聯(lián)合索引, 對ABC單獨(dú)建三個索引是沒用的。面試官又問,那我對BAC建聯(lián)合索引就命中不了索引了嗎?我說是的,被面試官懟了一下,其實MySQL在很久以前就在查詢優(yōu)化器里加入了這個feature,是可以命中的。3.只對需要作為查詢條件的列建索引,否則會拖慢插入速度。
6.MySQL存儲引擎由哪些?他們有什么區(qū)別?應(yīng)用場景是怎樣的
也是一道經(jīng)典MySQL題了,主要分為Innodb和MyISAM,最主要的區(qū)別在于InnoDB采用的簇集索引,MyISAM采用的是非簇集索引。
對于非簇集索引來說,葉子結(jié)點存放的值實際上是data域的地址,data和 索引是完全分離的。
7.用戶從輸入URL到看到瀏覽器展示結(jié)果,經(jīng)過了哪些過程?越詳細(xì)越好。
8.redis的數(shù)據(jù)類型有哪些?在哪些場景使用?
string, set, list, hash dict, zset
string就是經(jīng)常用的key value鍵值對;
hash dict可以表示一個對象,是一個field和value的映射表;
set就是集合,用hash來實現(xiàn)的;
list本質(zhì)上是個雙端隊列, 可以實現(xiàn)從左邊add也可以從右邊add
zset是有序集合, 用跳表來實現(xiàn),可以用來實現(xiàn)實時排行榜。
9.redis設(shè)置過期時間的原理是怎樣的?
這個我沒有看過,但是我猜了兩種策略,給猜對了:1.惰性刪除,像限流器那樣,只有在get的時候去檢查它是否expire,如果過期,就刪除。2.定時刪除。 具體的我沒想對,回去看了一下,官方給出的答案是這樣的:
Specifically this is what Redis does 10 times per second:
Test 20 random keys from the set of keys with an associated expire.
Delete all the keys found expired.
If more than 25% of keys were expired, start again from step 1.
也就是說,每秒做10次這樣的行為: 從所有設(shè)置過期時間的key中, 隨機(jī)選擇20個key,刪除所有過期的key, 如果25%的key都過期了,就回到步驟1再做一次。
10.你剛才提到了限流器,如何實現(xiàn)一個限流器?
限流器的原理就是令牌桶,按照一定的時間往桶里加入Token,如果桶已經(jīng)滿了丟棄令牌。每個新請求就消耗一個token, 如果token沒了就拒絕服務(wù)請求。新請求來臨時,會請求從桶中拿走一個Token,如果沒有Token可拿了就阻塞或者拒絕服務(wù)請求,它的所有計算本質(zhì)上都是惰性計算。
11.Goroutine為什么這么輕?
簡單來說,因為它是發(fā)生在操作系統(tǒng)的用戶態(tài)的,不需要進(jìn)入內(nèi)核態(tài)進(jìn)行系統(tǒng)調(diào)用,操作系統(tǒng)的上下文切換會帶來很大的開銷,切g(shù)oroutine和線程一樣,共享堆,不共享棧。
Golang的垃圾回收是怎么做的?
很早之前看過,剛好被問到了就回答得比較順利。三色并發(fā)標(biāo)記,基本思想是把內(nèi)存中的所有對象分為黑白灰三類,一開始所有對象都是白色對象,然后把所有可達(dá)對象標(biāo)記為灰色,再從所有灰色對象出發(fā),將所有觸及到的對象標(biāo)記為灰色,自身灰色標(biāo)記為黑色對象,如此循環(huán)往復(fù),直到?jīng)]有灰色對象為止,由于每次標(biāo)記剩下的都是不可達(dá)的白色對象,所以直接將白色對象刪除即可。
本文分享給需要面試刷題的朋友,也祝愿大家順利拿到自己想要的offer,這份資料主要包含了Java基礎(chǔ),數(shù)據(jù)結(jié)構(gòu),jvm,多線程等等,由于篇幅有限,以下只展示小部分面試題
有需要的伙伴可以關(guān)注、點贊、評論 私信回復(fù)我:“大廠”關(guān)鍵字,就可以拿到上述資料了!
]]>彥祖,都看到這了,點贊,收藏,叨叨一下扒~
①、創(chuàng)建網(wǎng)站:寶塔 網(wǎng)站——添加站點
輸入域名(前期自己在阿里云購買的域名),選擇創(chuàng)建數(shù)據(jù)庫,PHP版本選擇前面設(shè)置到的7.2。
注意:禾匠4.4.8后臺必須用MYSQL5.6 安裝,如果是其他版本,請先備份數(shù)據(jù)庫,然后卸載重新安裝
先找到我們在域名購買環(huán)節(jié)下載得到的(***apache、***nginx)兩個文件夾,其實用其中一個就行了,比如***nginx這個文件夾有2個文件,并且每個文件的類型都給標(biāo)記出來了,用記事本打開這倆文件,記事本會有一堆文字,復(fù)制粘貼到下面對應(yīng)的KEY/PEM框里,保存就OK了,同時打開強(qiáng)制HTTPS開關(guān)。
返回站點,應(yīng)該在下圖紅框位置有個部署之類的,部署后就跟下圖差不多了。
獲取源碼這事是在我整個搭建環(huán)節(jié)中最耗費(fèi)我時間的環(huán)節(jié),這個不是說時間長,跟域名備案比肯定要短點,主要原因還是我想弄個開源免費(fèi)的源碼,我還是太天真,從開源社區(qū)搞了好多源碼,都有套路,要么前端要錢,要么沒解壓密碼,實在沒辦法又回萬能的淘寶買源碼,淘寶一搜有很多,各類破解版,各類獨(dú)立版,甚至還有可升級版,我相信網(wǎng)上的技術(shù)大牛,可以實現(xiàn)更新,WINDOW都能破解這些小程序破解還不簡單,并且有足夠的需求市場在進(jìn)行利益驅(qū)動。
同樣本著高性價比的原則,按銷量排名,有好評的的店鋪,買了一套,淘寶的也有很多分類,有純提供源碼的,有提供安裝指導(dǎo)的,有提供更新服務(wù)的,有提供包上線的,我為了學(xué)習(xí)肯定要只要源碼自己鉆研,遇到困難解決困難,方可成長,讓人給搭建起來算啥事(最主要是窮),當(dāng)時買這套源碼也是忐忑的不行,雖然沒花幾個錢,因為當(dāng)時我的域名還沒備案下來,前端無法驗證,硬著頭皮上的。
在獲取了源碼搭建好后臺后,把后臺設(shè)置一遍后,我前面提到的剛開始的各種疑問豁然開朗,原來小程序是這樣的,為啥一些小程序能賣200 300元,這也能想到我疫情期間臨時搭建的小程序花費(fèi)500元的成本,也不便宜,可想而知在疫情期間賣小程序的得賺了多少錢,全國在疫情期間像我們這樣有線上售賣需求的企業(yè)數(shù)量級估計得百萬級別,短期的小陳鼓搭建成本非常低,等于臨時租賃服務(wù)器和源碼網(wǎng)站。
獲取源碼一般分:后端和前端,所謂后端就是要傳到我們租賃的服務(wù)器上,形成一個運(yùn)行的網(wǎng)站,前端是在微信小程序端上傳的(有開發(fā)工具),前端后端通過在前端設(shè)定好胡同的鏈接,即可實現(xiàn)搭建。
他們說還有很多其他形式,作為技術(shù)小白的我就不去分析了,只說明我搭建成功的這個流程即可,別貶低我也不用贊揚(yáng)我,因為我沒有任何敲代碼的能力,最多理解邏輯后復(fù)制粘貼而已。
]]>