面試被吊打 - Redis原理
unlink key、flushdb async、flushall async 等Redis 的大部分操作都在內(nèi)存中完成,內(nèi)存中的執(zhí)行效率本身就很快,并且采用了高效的數(shù)據(jù)結(jié)構(gòu),比如哈希表和跳表。 使用單線程避免了多線程的競(jìng)爭(zhēng),省去了多線程切換帶來(lái)的時(shí)間和性能開(kāi)銷,并且不會(huì)出現(xiàn)死鎖。 采用 I/O 多路復(fù)用機(jī)制處理大量客戶端的Socket請(qǐng)求,因?yàn)檫@是基于非阻塞的 I/O 模型,這就讓Redis可以高效地進(jìn)行網(wǎng)絡(luò)通信,I/O的讀寫流程也不再阻塞。
AOF 日志(Append Only File,文件追加方式):記錄所有的操作命令,并以文本的形式追加到文件中。 RDB 快照(Redis DataBase):將某一個(gè)時(shí)刻的內(nèi)存數(shù)據(jù),以二進(jìn)制的方式寫入磁盤。 混合持久化方式:Redis 4.0 新增了混合持久化的方式,集成了 RDB 和 AOF 的優(yōu)點(diǎn)。

數(shù)據(jù)可能會(huì)丟失:如果 Redis 剛執(zhí)行完命令,此時(shí)發(fā)生故障宕機(jī),會(huì)導(dǎo)致這條命令存在丟失的風(fēng)險(xiǎn)。 可能阻塞其他操作:AOF 日志其實(shí)也是在主線程中執(zhí)行,所以當(dāng) Redis 把日志文件寫入磁盤的時(shí)候,還是會(huì)阻塞后續(xù)的操作無(wú)法執(zhí)行。
save 和 bgsave。save 命令在主線程中執(zhí)行,會(huì)導(dǎo)致阻塞。而 bgsave 命令則會(huì)創(chuàng)建一個(gè)子進(jìn)程,用于寫入 RDB 文件的操作,避免了對(duì)主線程的阻塞,這也是 Redis RDB 的默認(rèn)配置。
面試官:
bgsave的子線程實(shí)現(xiàn)的,具體操作如下:如果主線程執(zhí)行讀操作,則主線程和 bgsave子進(jìn)程互相不影響;如果主線程執(zhí)行寫操作,則被修改的數(shù)據(jù)會(huì)復(fù)制一份副本,然后 bgsave子進(jìn)程會(huì)把該副本數(shù)據(jù)寫入 RDB 文件,在這個(gè)過(guò)程中,主線程仍然可以直接修改原來(lái)的數(shù)據(jù)。

要注意,Redis 對(duì) RDB 的執(zhí)行頻率非常重要,因?yàn)檫@會(huì)影響快照數(shù)據(jù)的完整性以及 Redis 的穩(wěn)定性,所以在 Redis 4.0 后,增加了 AOF 和 RDB 混合的數(shù)據(jù)持久化機(jī)制: 把數(shù)據(jù)以 RDB 的方式寫入文件,再將后續(xù)的操作命令以 AOF 的格式存入文件,既保證了 Redis 重啟速度,又降低數(shù)據(jù)丟失風(fēng)險(xiǎn)。

哨兵模式

Redis Cluster(集群)

面試官:

面試官:
根據(jù)鍵值對(duì)的 key,按照 CRC16 算法計(jì)算一個(gè) 16 bit 的值。 再用 16bit 值對(duì) 16384 取模,得到 0~16383范圍內(nèi)的模數(shù),每個(gè)模數(shù)代表一個(gè)相應(yīng)編號(hào)的哈希槽。

有道無(wú)術(shù),術(shù)可成;有術(shù)無(wú)道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號(hào)
好文章,我在看??
評(píng)論
圖片
表情
