2020-08-20 晚上面試

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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容