本期是【你好,面試官】系列文章的第21期,持續(xù)更新中…。
《你好,面試官》系列目前已經(jīng)連載 20 篇了,據(jù)說看了這個(gè)系列的朋友都拿到了大廠offer~
- 歡迎星標(biāo)+訂閱,持續(xù)更新中。。。致力打造校招核心面試攻略~
- Java 校招面試網(wǎng)站:www.java2top.cn
考點(diǎn)速查
本期考點(diǎn)涉及,JVM
、MySQL高級
、Redis持久化
本期題改編自 ——2023屆春招 阿里 實(shí)習(xí) 二面
面試現(xiàn)場
叮叮?!?/p>
面試官:“你好,我是XX面試官,請問是小龍嗎?”
小龍:“您好,面試官,我是小龍”
面試官:“好的,現(xiàn)在有空嗎,我們開始面試吧”
小龍:“嗯嗯,準(zhǔn)備好啦”
…
other questions(自我介紹、項(xiàng)目略)
…
面試官:“我看你簡歷寫熟悉 JVM
,system.gc()一定會(huì)觸發(fā)gc嗎?和full gc有什么關(guān)系?”
獨(dú)白:“wc,平時(shí)還真沒關(guān)注過這個(gè)問題”
小龍:“system.gc()
可以顯示觸發(fā) fullgc,以回收老年代和新生代,釋放無用對象占用的內(nèi)存,底層通過 Runtime . getRuntime() .gc()
調(diào)用?!?/p>
小龍:“但是這個(gè)顯示調(diào)用附帶免責(zé)聲明,只是提醒 JVM 的垃圾收集器執(zhí)行 Full Gc ,具體執(zhí)行與否什么時(shí)候執(zhí)行,還得看收集器。”
面試官:“好的,了解 Redis 持久化嗎?”
小龍:“enen,是這樣的,Redis 為了保證宕機(jī)能恢復(fù)數(shù)據(jù),提供了持久化手段,可以采用RDB、AOF持久化,Redis4.x后更支持RDB、AOF混合持久化?!?/p>
面試官:“那說說 AOF 持久機(jī)制是怎樣的?”
小龍:“簡單來說,AOF 文件是將寫操作命令按照約定的格式保存下來,若宕機(jī)順序執(zhí)行命令即可恢復(fù)數(shù)據(jù);并且它采用 “寫后日志”的模式,即 Redis 先執(zhí)行命令寫內(nèi)存,后寫日志;”
面試官:“為何采用寫后日志呢?”
小龍:“嗯,首先 Redis 執(zhí)行命令先寫內(nèi)存,這樣可以對命令做預(yù)檢,防止錯(cuò)誤命令記錄到日志;同時(shí),記錄AOF日志時(shí),無須對語法做檢查,因此寫后日志還可以避免額外開銷?!?/p>
小龍:“并且,由于是命令執(zhí)行完后再寫日志,也不會(huì)阻塞主進(jìn)程寫操作?!?/p>
面試官:“剛才你說 AOF 是一直追加命令,那隨著時(shí)間推移,這個(gè)AOF文件不會(huì)越來越大嗎,Redis是怎樣處理的呢?”
小龍:“Redis 為了避免 AOF 文件越寫越大,提供了 AOF 重寫機(jī)制?!?/p>
獨(dú)白:“關(guān)于小龍面試經(jīng)典分析全記錄在【面試筆記】中,有詳細(xì)總結(jié)?!?/p>
面試官:“這個(gè)重寫機(jī)制是怎樣的呢?”
小龍:“簡單來說就是,首先知道 AOF 里面存的寫操作命令,但是很多條執(zhí)行命令可能起到的效果最后只需要幾條命令即可實(shí)現(xiàn)?!?/p>
小龍:“重寫即把冗余的命令用新的命令替換,再將新命令記錄到新的 AOF 文件中,最后再替換老的 AOF 文件。”
面試官:“那如果是大量寫入,線程將會(huì)被長時(shí)間阻塞,Redis 是單線程的,這樣就不能處理客戶端的請求命令,怎么辦?”
小龍:“主進(jìn)程是通過 fork 一個(gè) bgrewriteaof 子進(jìn)程進(jìn)行 aof 日志重寫。由于后臺新開進(jìn)程重寫,主進(jìn)程可以繼續(xù)處理命令請求,可以避免阻塞主進(jìn)程。”
小龍:“但是fork子進(jìn)程這個(gè)操作也是主進(jìn)程實(shí)現(xiàn),其中由于要復(fù)制父進(jìn)程的頁表等數(shù)據(jù)結(jié)構(gòu),若頁表過大,便可能阻塞主線程?!?/p>
面試官:“那假如你在寫原來的數(shù)據(jù)時(shí),父進(jìn)程又處理了新的命令,會(huì)造成子父進(jìn)程數(shù)據(jù)不一致嗎?”
獨(dú)白:“這就有裝逼得啦~”
小龍:“子進(jìn)程進(jìn)行日志重寫時(shí),若有新數(shù)據(jù)寫入,主進(jìn)程執(zhí)行完命令后會(huì)將命令寫入到 「AOF 緩沖區(qū)」和 「AOF 重寫緩沖區(qū)」”
小龍:“然后,子進(jìn)程重寫完成后,會(huì)異步向主進(jìn)程發(fā)送一條信號;”
小龍:“主進(jìn)程接收到信息,便將 AOF 重寫緩沖區(qū)中的所有內(nèi)容追加到新的 AOF 的文件中,最后修改文件名,原子切換老文件,完成重寫便保證了數(shù)據(jù)的一致性?!?/p>
面試官:“那如何開啟AOF的?”
小龍:“可以手動(dòng)觸發(fā),也可以文件配置?!?/p>
面試官:“具體說說呢?”
小龍:“可以通過配置 redis.conf 文件來開啟 AOF 持久化 appendonly yes
,同時(shí)需要聯(lián)合配置同步策略,觸發(fā)時(shí)機(jī)。但是 AOF 的重寫需要 fork,這是一個(gè)重量級操作,可能會(huì)對 Redis 造成阻塞?!?/p>
小龍:“因此為了不影響 Redis 主進(jìn)程響應(yīng),我們需要盡可能降低 fork 的頻率,降低阻塞,可以通過 bgrewriteaof 手動(dòng)來觸發(fā) AOF 重寫?!?/p>
面試官:“Ok,我看你簡歷寫了 MySQL,說說什么是 MySQL 兩段提交吧?”
小龍:“其實(shí)所謂的兩階段就是把一個(gè)事物分成兩個(gè)階段(prepare、commit)來提交,而實(shí)際上開啟兩階段提交只是為了保證 redolog 和 binlog 日志數(shù)據(jù)的安全一致性?!?/p>
小龍:“若你壓根不需要使用 binlog 進(jìn)行日志備份,主從復(fù)制相關(guān)的,其實(shí)完全可以不用兩階段提交,因?yàn)閮H保證 redolog 成功寫盤就可以保證 crash 的恢復(fù)啦?!?/p>
面試官:“能講一下具體怎樣提交的嗎?”
小龍:“可以完整的分析一下,假如現(xiàn)在需要更新一條數(shù)據(jù),前面肯定都知道會(huì)權(quán)限判斷,詞發(fā)語法分析,優(yōu)化器生成最佳執(zhí)行計(jì)劃,準(zhǔn)備執(zhí)行,執(zhí)行前還會(huì)記錄 undolog 便于回滾,然后開始調(diào)用存儲引擎執(zhí)行 SQL。”
小龍:“此時(shí)若選用 InnoDB 引擎,會(huì)看 buffer pool 里有無相關(guān)數(shù)據(jù),沒有會(huì)將數(shù)據(jù)先加載到 buffer pool 進(jìn)行更新;”
獨(dú)白:“當(dāng)然還涉及到唯一索引,普通索引等細(xì)節(jié),這里不詳細(xì)展開,具體可以看【面試筆記】”
小龍:“最后內(nèi)存數(shù)據(jù)更新后,會(huì)將這個(gè)更新操作會(huì)記錄到 redo log,redo log 處于 prepare 狀態(tài),告知執(zhí)行器執(zhí)行完,可提交事務(wù)?!?/p>
小龍:“執(zhí)行器生產(chǎn)這個(gè)操作的 binlog,并將 binlog 寫入磁盤,執(zhí)行器調(diào)用引擎事務(wù)提交接口,引擎把剛寫入的 redo log 改為 commit 狀態(tài),最后更新完成;”
小龍:“此刻整個(gè)過程完成,最后事務(wù)提交時(shí)便是分兩個(gè)階段提交?!?/p>
面試官:“Ok,用過 explain 嗎,explain 語句會(huì)執(zhí)行 SQl 嗎?”
小龍:“explain 只走到優(yōu)化器,要掃描多少行也只是個(gè)估計(jì)值,并沒有實(shí)際執(zhí)行。它只是一個(gè)執(zhí)行計(jì)劃,生成來自優(yōu)化器關(guān)于 SQL 的執(zhí)行信息,但是如果查詢在 FROM 中子句包括子查詢,MySQL 會(huì)執(zhí)行子查詢”
獨(dú)白:“不愧是我,真男人是也!【面試筆記】在手,大廠 offer 不愁?!?/p>
知識總結(jié)
本期我們通過面試模擬還原阿里二面。訂閱+星標(biāo)持續(xù)追更。
面試重點(diǎn)文章來源:http://www.zghlxwxcb.cn/news/detail-445906.html
Redis 持久化機(jī)制
、MySQL undoLog 日志
文章來源地址http://www.zghlxwxcb.cn/news/detail-445906.html
到了這里,關(guān)于你好,面試官 | 阿里二面,被問麻了。。的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!