騰訊音樂(lè) 面經(jīng)
一面
- 多級(jí)緩存下,它的這個(gè)跟數(shù)據(jù)庫(kù)一致性它怎么做去保證的?
- (關(guān)于 mget 改成 get 的優(yōu)化)那其實(shí)我這里有點(diǎn)好奇是說(shuō),因?yàn)槠鋵?shí) mget 是一個(gè)批處理的獲取命令。它如果在全部改成 get 的話(huà),現(xiàn)在網(wǎng)絡(luò)開(kāi)銷(xiāo)會(huì)增加不少。那為什么的 RT 時(shí)間會(huì)減少呢?
- (針對(duì)簡(jiǎn)歷描述“減少每日 53K 批量操作”)減少每日 53K,其實(shí)我感覺(jué)好像這個(gè) KP(QPS?) 的不是很高... 這個(gè) S 的這個(gè)操作好像也對(duì)不上。(質(zhì)疑/要求澄清優(yōu)化效果與描述的關(guān)聯(lián))
- 那權(quán)益卡那邊有做一些,比如說(shuō)超發(fā)了一些防護(hù)嗎?就是一些問(wèn)題嗎?
- 對(duì)于你負(fù)責(zé)的那個(gè)業(yè)務(wù)模塊里面,有沒(méi)有遇到什么一些服務(wù)問(wèn)題?就你遇到這個(gè)問(wèn)題到當(dāng)時(shí)是怎么解決的?(要求舉例說(shuō)明遇到的棘手問(wèn)題及解決方案)
- 有遇到一些緩存的一些集中性的一些問(wèn)題嗎?... 熱 key 的一些問(wèn)題有沒(méi)有遇到過(guò)?
- 原本有考慮過(guò)用布隆過(guò)濾器那些東西嗎?
系統(tǒng)運(yùn)維 & 監(jiān)控 & 壓測(cè)
- 你寫(xiě)的服務(wù)有對(duì)自己服務(wù)進(jìn)行一個(gè)壓測(cè)嗎?
- (服務(wù))有做一些監(jiān)控嗎?就是怎么發(fā)現(xiàn)一些異常。
數(shù)據(jù)庫(kù) (MySQL)
- 假設(shè)某一天... mysql... 它的負(fù)載變高了,你覺(jué)得它可能是什么問(wèn)題引起的?
- (針對(duì) MySQL 負(fù)載高)讓你的排查的一個(gè)思路跟流程... 你會(huì)怎么去去定位這種問(wèn)題,然后去解決這種問(wèn)題。
- (MySQL CPU 升高)怎么看呢?(指用什么命令或工具)
- 慢查詢(xún),你覺(jué)得有可能有些什么情況會(huì)導(dǎo)致一些索引失效,這種情況?
- 假設(shè)我要減少一些回表的話(huà),我所以(索引)應(yīng)該怎么設(shè)計(jì)?(覆蓋索引相關(guān))
- 你剛說(shuō)的 B 加數(shù),它跟 B 數(shù)的區(qū)別在哪里?
- B 數(shù)它的有什么適用的一種場(chǎng)景嗎?(相對(duì) B+樹(shù))
- 日常有用到(的)數(shù)據(jù)庫(kù)是用到 B 樹(shù)了嗎?(確認(rèn) MongoDB 是否使用 B 樹(shù))
- 怎么避免長(zhǎng)事務(wù)呢?
- (關(guān)于事務(wù)開(kāi)始時(shí)間)但一個(gè)事物真正開(kāi)始可能不是 start 這句話(huà)就開(kāi)始。(暗示/引導(dǎo)思考)
緩存 (Redis)
- (項(xiàng)目里有提到)防止緩存雪崩的一些問(wèn)題嗎?
- 你能講一講 redis 那個(gè)數(shù)據(jù)淘汰的一些策略嗎?
- (項(xiàng)目里)有用到一個(gè) sorted set 的一個(gè) set 結(jié)構(gòu)嗎?你知道它底層數(shù)據(jù)結(jié)構(gòu)是什么這種結(jié)構(gòu)嗎?(跳表/壓縮列表)
Linux & 網(wǎng)絡(luò)
- 假設(shè)我要向(想)看一下網(wǎng)絡(luò)端口的一個(gè)占用情況的話(huà),你會(huì)下什么命令。
- 假設(shè)我想看一下端口那個(gè)網(wǎng)絡(luò)狀態(tài)... 到底處于比如說(shuō) TCP 哪種階段。
- 假設(shè)我看到通過(guò) netstat 那個(gè)命令,看到很多端口處于那種 time_wait 的那種狀態(tài),你覺(jué)得是什么問(wèn)題引起的?
- 怎么怎么避免這種情況(大量 TIME_WAIT)?
- 有了解過(guò) TCP 里面的一個(gè)快速重傳機(jī)制嗎?
- 有了解 TCP 粘包的一些問(wèn)題嗎?
Go 語(yǔ)言
- (項(xiàng)目里有用 Go 嗎?)能能解說(shuō)一下夠(Go)的那個(gè)(GC)的一個(gè)雞翅(機(jī)制)嗎?
算法 & 數(shù)據(jù)結(jié)構(gòu)
- 比如說(shuō)我有一個(gè) 10 億個(gè)整數(shù),對(duì)我要快速找到最大 100 個(gè)。對(duì)你怎么做?(Top K 問(wèn)題)
- 你能說(shuō)一下快速排序跟歸并排序的它的一個(gè)時(shí)間復(fù)雜度嗎?
- 這兩者(快速排序和歸并排序)的區(qū)別在哪里?
二面
- 一般這個(gè)(活動(dòng)接口)QPS 會(huì)有多高?
- 你是說(shuō) Redis 的 QPS 不是整個(gè)業(yè)務(wù)的 QPS 是吧?就不是一個(gè)接口的 API 的 QPS。
- 這兩者(API QPS vs Redis QPS)有看過(guò)差距會(huì)有多大嗎?
- 當(dāng)時(shí)為什么關(guān)注更更關(guān)注 Redis QPS,而不是 API 的 QPS?
- 那 Redis 后面是 7 萬(wàn)(QPS),然后就要做什么優(yōu)化嗎?
- 那那本地緩存優(yōu)化之后,Redis 的 QPS 降了多少?
- 之前是沒(méi)有本地緩存是嗎?
- 然后本地緩存是用什么?也是用什么做的?(確認(rèn)是 Caffeine)
- 那這個(gè)二級(jí)緩存會(huì)跟 Redis 的緩存...可能會(huì)有在某些瞬間不一致,會(huì)有什么業(yè)務(wù)損失嗎?
- 這個(gè)就是那這一個(gè)維護(hù)緩存的是一個(gè)獨(dú)立的服務(wù)嗎?
- 那有那個(gè)比如說(shuō)那有操作失?。ň彺娓?刪除)的情況嗎?會(huì)怎么樣?
- 然后這個(gè) Redis...本身你是第一級(jí)緩存,它底層的數(shù)據(jù)是有 MySQL 的嗎?還是就是靠剛說(shuō)那個(gè)一個(gè)服務(wù)來(lái)更新的。
- 然后 Redis...假使斷電丟失了會(huì)怎么樣?斷電重啟了會(huì)怎么樣?
- 你前面說(shuō)說(shuō)從 MySQL 里面找,然后這個(gè)找是有現(xiàn)成程序的,還是到時(shí)候可能假設(shè)發(fā)生情況了,可能是要重新看怎么去重新去 load 數(shù)據(jù)...還是什么。它是自然而然的。(追問(wèn)緩存加載/恢復(fù)機(jī)制)
- 那你前面是說(shuō)那個(gè)可能是運(yùn)營(yíng)人員在后臺(tái)操作上上下線(xiàn)的時(shí)候才會(huì)更新 Redis 是吧?還是說(shuō)就前端有讀取的時(shí)候,也會(huì)從 MySQL 里面去讀,然后讀到更新到 Redis。(追問(wèn)緩存更新觸發(fā)機(jī)制)
- 但就像你剛才說(shuō)的,像 AOF 這些,其實(shí)平常都是運(yùn)維管,你們不管的對(duì)嗎?還是你們會(huì)參與?
- 比如說(shuō)(Redis 抖動(dòng))什么意思?(要求解釋技術(shù)術(shù)語(yǔ)/現(xiàn)象)
- 然后這種(Redis 抖動(dòng))會(huì)認(rèn)為健康還是需要什么處理嗎?(監(jiān)控與應(yīng)對(duì))
- 最終在整個(gè)活動(dòng)模塊上...過(guò)程中還還你還有碰到什么其他問(wèn)題,或者覺(jué)得比較不合理的地方嗎?哪怕可能還沒(méi)來(lái)得及做的優(yōu)化的。
- 比如說(shuō)一個(gè)用戶(hù)命中 100 個(gè)活動(dòng),然后你預(yù)期它的這個(gè)存儲(chǔ)消耗大概是多大。
- 那看上去就是可能說(shuō)這部分,你是認(rèn)為這部分關(guān)聯(lián)關(guān)系的存儲(chǔ)成本大,還是那個(gè)活動(dòng)詳情的那部分存儲(chǔ)成本的?
- (針對(duì)候選人回答活動(dòng)詳情占用內(nèi)存大)但是那個(gè)活動(dòng)詳情他可能總共也就 100 或者說(shuō)最多幾百個(gè)活動(dòng)。他可能就在這臺(tái)機(jī)器上總共也占不了多少空間...總共可能也就只有一兆數(shù)據(jù)。(質(zhì)疑/挑戰(zhàn)候選人關(guān)于內(nèi)存消耗的判斷)
- 怎么會(huì) GC 呢?如果說(shuō)占的那個(gè)內(nèi)存空間不是很大的話(huà),那為什么會(huì) GC 呢?(追問(wèn) GC 觸發(fā)原因)
技術(shù)棧 & 設(shè)計(jì)能力
- 其實(shí)像你現(xiàn)在這些技術(shù)棧,整個(gè) Spring 或者 MySQL 或者這些...你覺(jué)得其實(shí)你用哪一個(gè),其實(shí)你覺(jué)得用的是比較好,比較有優(yōu)勢(shì)。
- 你一般你自己的你習(xí)慣性的思考的數(shù)據(jù)的方式,你覺(jué)得會(huì)偏 Redis 這樣 KV 的還是 MySQL 這種關(guān)系型數(shù)據(jù)庫(kù)的。
- MySQL,那在一些具體的 MySQL 的那些表的設(shè)計(jì)上,你覺(jué)得有哪個(gè)案例是你你過(guò)去的哪個(gè)實(shí)習(xí)案例是比較能體現(xiàn)這種 MySQL 的一些設(shè)計(jì)或者理解能力的。
- 那你一般會(huì)怎么去梳理(數(shù)據(jù)庫(kù)設(shè)計(jì))嗎?是會(huì)怎么寫(xiě)文檔,或者寫(xiě)一個(gè)什么樣的文檔,或者畫(huà)一個(gè)什么樣的圖。
- 然后一般實(shí)現(xiàn)會(huì)按 ER 圖來(lái)實(shí)現(xiàn),還是說(shuō)可能經(jīng)常會(huì)有什么樣的妥協(xié)。
- (針對(duì) MySQL 存儲(chǔ) JSON)你是是你會(huì)直接存?zhèn)€字符串,還是用它本身現(xiàn)在支持的 JSON 的一個(gè)字段能實(shí)現(xiàn)。
- (針對(duì)使用 Text 存 JSON 的妥協(xié))并(頻繁變更的列)剛才是因?yàn)橐l繁讀寫(xiě)。(確認(rèn)妥協(xié)原因)