2020-08-20 晚上面試
- 自我介紹
- 你最近做過哪些項(xiàng)目。
- 為什么要離職。
更公平的競爭環(huán)境和脫離舒適圈。
- 你的項(xiàng)目里有對redis的多次操作,怎么提高效率。
利用redis的pipe,將多次redis操作合并一起,降低網(wǎng)絡(luò)延遲。
- 剛剛你說到sortedset,sort是怎么實(shí)現(xiàn)的。
利用了跳表實(shí)現(xiàn)了排序。
- sortedset的查詢一個(gè)數(shù)據(jù)的時(shí)間復(fù)雜度是怎么樣子的?
一開始答的logn,面試官說你確定嗎?我就不確定了,查了一下,確實(shí)是logn。
- 跳表是怎么實(shí)現(xiàn)的?
仍然是鏈表的結(jié)構(gòu),但是多了幾個(gè)指針指向更加后面的值,實(shí)現(xiàn)快速跳躍。
- redis的集群有幾種?
三種,主從,哨兵,集群。
- 分別說一下這幾種。
主從是指有兩個(gè)redis節(jié)點(diǎn),其中從節(jié)點(diǎn)保持跟主節(jié)點(diǎn)同步。
- 同步方式是怎么樣子的?
就是當(dāng)redis有寫操作的時(shí)候,給從節(jié)點(diǎn)也發(fā)一個(gè),但是從節(jié)點(diǎn)不會過期key,所以主節(jié)點(diǎn)有key刪除的時(shí)候,也會跟從節(jié)點(diǎn)說刪除某個(gè)key。(其實(shí)這個(gè)只是增量復(fù)制,還有全量復(fù)制忘記了。。)
哨兵模式是利用一個(gè)哨兵,定時(shí)地去ping redis的節(jié)點(diǎn),當(dāng)redis節(jié)點(diǎn)不可達(dá)之后,會通過修改配置文件,讓從redis代替主節(jié)點(diǎn),維持可用。
redis集群是通過redis key hash分區(qū)之后落在哪個(gè)hash槽中,而每個(gè)redis節(jié)點(diǎn)都負(fù)責(zé)一部分hash槽,從而找到該key應(yīng)該被哪個(gè)節(jié)點(diǎn)所處理。
- redis集群是怎么實(shí)現(xiàn)高可用的?
答了通過gossip協(xié)議來同步配置。。。
事實(shí)上錯(cuò)了。。我忘記redis集群也有從節(jié)點(diǎn)了,當(dāng)多個(gè)節(jié)點(diǎn)發(fā)現(xiàn)有節(jié)點(diǎn)不通,就判定該節(jié)點(diǎn)不可達(dá),然后對他故障轉(zhuǎn)移,然后從他的從節(jié)點(diǎn)中選中一個(gè)替換他,保證高可用。
- redis至少有多少個(gè)才能成為集群?(因?yàn)槲疑项}答錯(cuò)了)
3個(gè)。
- 你確定是三個(gè)嗎?
不確定。。但是我記得是要3個(gè)節(jié)點(diǎn)。(事實(shí)上還有從節(jié)點(diǎn)啊?。。。┫丛璧臅r(shí)候才想起來。
- mysql用的多嗎?
挺多挺熟的。
- mysql有多少種存儲引擎。
mysql存儲引擎有很多種,因?yàn)樗С肿约洪_發(fā),但是常用的只有innodb和 MyISAM 。
- 說說他們之前的差別。
innodb支持事務(wù),myisam不支持。
innodb用的行表,myisam用的表鎖。
- 四個(gè)隔離級別。
我忘記四個(gè)隔離級別叫什么名字了,只記得具體表現(xiàn),跟面試官說了每種隔離級別的具體表現(xiàn)。
應(yīng)該是未提交讀,提交讀,可重復(fù)讀,串行化。
- innodb是第幾個(gè)級別。
第三種(可重復(fù)讀)
- 那可重讀和可串行化的差距在哪里?
記得跟區(qū)間有關(guān),具體忘記了。(答案是范圍讀的時(shí)候,如果其他事務(wù)在該范圍插入數(shù)據(jù)的時(shí)候,會被讀到)
- 主鍵索引和唯一索引的區(qū)別。
主鍵的話是聚簇索引,數(shù)據(jù)的內(nèi)容會存在索引的葉子節(jié)點(diǎn)之上,而唯一索引的葉子節(jié)點(diǎn)只保存主鍵數(shù)據(jù)。
- 唯一索引查詢的時(shí)候就要回表咯?
不是的,要看查詢的內(nèi)容,要是select的數(shù)據(jù)就是索引內(nèi)容的話,就不用回表。
- 怎么看一條語句的性能。
explain。
- 有哪些數(shù)據(jù)需要注意的?
索引類型和行數(shù)。。
- 哪種索引類型最好。
答了index(事實(shí)上不對,最好應(yīng)該是NULL,就是不用查直接算出來的那種)
- golang熟不熟?。?/li>
熟啊,就用了很久。
- map是線程安全的嗎?
不是。
- 怎么解決這個(gè)問題呢?
用讀寫鎖和sync.map。
- 讀寫鎖的表現(xiàn)形式是怎么樣的。
當(dāng)其中一個(gè)協(xié)程擁有寫鎖的時(shí)候,其他協(xié)程不管是要讀鎖還是寫鎖,都會被阻塞。
其中一個(gè)協(xié)程擁有讀鎖時(shí),其他協(xié)程只能申請讀鎖,而申請寫鎖會被阻塞住。
- chan怎么實(shí)現(xiàn)的。
用的環(huán)形鏈表。有個(gè)頭尾指針,還有個(gè)結(jié)構(gòu)存儲被chann阻塞的goroutine。
- 有緩存和沒緩存的chan表現(xiàn)形式有什么不同?
有緩存當(dāng)緩存未滿時(shí),往里面塞數(shù)據(jù)不會被阻塞,但是沒緩存的會被阻塞。
- 這樣一個(gè)場景,如果我要往一個(gè)緩存chan里面塞東西,塞不進(jìn)去就丟掉怎么辦?
我一直都是用select拿數(shù)據(jù),忘記他還可以用來看緩存是否滿了,一開始答的對比len和cap后面才答了select,試了一下,果然可以。
func main() {
testChan := make(chan int, 1)
testChan <- 1
select {
case testChan <- 2:
println("aaa")
default:
println("bbb")
}
}
//output:bbb
- 數(shù)組和切片的區(qū)別。
數(shù)組創(chuàng)建的時(shí)候,內(nèi)存是固定的,只能放那么多元素,沒有放的元素都初始化了。切片存儲了是數(shù)組的指針和len和cap,可拓展
- 切片的append操作時(shí)怎么樣子的?
會在切片的后面增加一個(gè)元素,如果切片滿了要擴(kuò)容,那么返回的值將和原來的切片不是一個(gè)指針。
- 說說切片的擴(kuò)容。
就插入的時(shí)候發(fā)現(xiàn)切片內(nèi)存不夠了,就會觸發(fā)擴(kuò)容,會申請一個(gè)原容量兩倍的數(shù)據(jù)切片,但是在到了一定程度(猜的1000,應(yīng)該是1024)就不是兩倍了,會是25%。
- 講講go的協(xié)程調(diào)度?
(內(nèi)容太多了,自己查一下吧。)
- 如果協(xié)程發(fā)生阻塞會怎么樣?
p會脫離m,讓m綁定g,p去找其他m繼續(xù)執(zhí)行任務(wù)。
- 網(wǎng)絡(luò)阻塞呢?
會有一個(gè)net list,有事件的epoll會到這個(gè)net list中,調(diào)度器會定時(shí)把這里面的數(shù)據(jù)拿到全局g隊(duì)列里面(其實(shí)m在自旋的時(shí)候也會拿,忘記答了)
- 你們的etcd有做服務(wù)負(fù)載嗎?
我們的負(fù)載均衡是靠自己實(shí)現(xiàn)的,etcd的表現(xiàn)更像是一個(gè)數(shù)據(jù)庫的存在。
- 你有用prometheus吧?那你監(jiān)控里的句柄數(shù),cpu使用時(shí)怎么算的?
go的prometheus包自帶的,用查詢語句就能查出來。
- 有用過pprof嗎?
有的。
- 主要用來干嘛?
看協(xié)程泄露,因?yàn)樗涗浟嗣總€(gè)協(xié)程的堆棧,特別容易看。
- 那如果發(fā)現(xiàn)自己的go程序cpu很高怎么辦?
利用pprof可以分析go程序,看到所有函數(shù)的cpu使用率。
- linux有用嗎?
有的。
- centos還是Ubuntu。
都有,服務(wù)器用的centos,自己是用wsl,是Ubuntu。
- 你們服務(wù)器用的docker嗎?k8s呢?
都沒有,最原始的虛擬機(jī)。
- 怎么看連接?
netstat指定一個(gè)進(jìn)程。
- 具體是什么命令。
忘記了。( netstat –ano|findstr )
- timewait是什么狀態(tài)?
四次揮手之后,為了防止數(shù)據(jù)誤傳端口,端口需要保持這個(gè)狀態(tài)一段時(shí)間。
- 怎么看句柄。
lsof。
- 看cpu占用。
top,可以看到每個(gè)進(jìn)程,如果要詳細(xì),可以用vmstat。
- 最后問一道算法題,實(shí)現(xiàn)一個(gè)lru。
一開始沒有要求,我就隨便說了用數(shù)組,最簡單的那種。
- 時(shí)間復(fù)雜度要求1呢?
用map+list+加記錄頭尾兩節(jié)點(diǎn)實(shí)現(xiàn)時(shí)間復(fù)雜度為1的lru。