更新時(shí)間:2022-12-30 11:43:03 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1296次
很多大廠都在使用redis,所以今天小編當(dāng)作搬運(yùn)工,為大家整理了一份Redis面試題,合計(jì)了10個(gè)題目,還算是比較全,題目涵蓋基礎(chǔ)題和高級(jí)題。希望對(duì)各位讀者有所幫助,祝大家前程似錦。
什么是 Redis?
Redis全稱(chēng)為Remote Dictionary Server,它是現(xiàn)在最受歡迎的、完全開(kāi)源免費(fèi)的、遵守 BSD 協(xié)議的NoSQL數(shù)據(jù)庫(kù)之一,它是一個(gè)使用ANSI C編寫(xiě)的開(kāi)源、包含多種數(shù)據(jù)結(jié)構(gòu)、支持網(wǎng)絡(luò)、基于內(nèi)存、可選持久性的鍵值對(duì)存儲(chǔ)數(shù)據(jù)庫(kù),其具備如下特性:
①基于內(nèi)存運(yùn)行,性能高效;
②支持分布式,理論上可以無(wú)限擴(kuò)展;
③支持?jǐn)?shù)據(jù)持久化,重啟的時(shí)候可以再次加載進(jìn)行使用;
④支持五種數(shù)據(jù)類(lèi)型和數(shù)據(jù)備份。
相比于其它數(shù)據(jù)庫(kù)類(lèi)型,Redis具備的特點(diǎn)是:
Redis 支持的常見(jiàn)五種數(shù)據(jù)類(lèi)型:string(字符串),hash(哈希),list(列表),set(集合)及 zset(sorted set,有序集合)。項(xiàng)目中比較常用的是 string和hash, 如果你是 Redis 高級(jí)用戶(hù),還需要加上下面幾種數(shù)據(jù)結(jié)構(gòu) :HyperLogLog、Geo、Pub/Sub。如果你說(shuō)還玩過(guò) Redis Module,像 BloomFilter(布隆過(guò)濾器),RedisSearch,Redis-ML,面試官得眼睛就開(kāi)始發(fā)亮了。
Redis 與其它 key-value 存儲(chǔ)有什么不同?
答:(1)Redis 有著更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并且提供對(duì)它們的原子性操作,這是一個(gè)不同于其它數(shù)據(jù)庫(kù)的進(jìn)化路徑。Redis 的數(shù)據(jù)類(lèi)型都是基于基本數(shù)據(jù)結(jié)構(gòu)的,同時(shí)對(duì)程序員透明,無(wú)需進(jìn)行額外的抽象。
(2)Redis 運(yùn)行在內(nèi)存中但是可以持久化到磁盤(pán),所以在對(duì)不同數(shù)據(jù)集進(jìn)行高速讀寫(xiě)時(shí)需要權(quán)衡內(nèi)存,因?yàn)閿?shù)據(jù)量不能大于硬件內(nèi)存。在內(nèi)存數(shù)據(jù)庫(kù)方面的另一個(gè)優(yōu)點(diǎn)是,相比在磁盤(pán)上相同復(fù)雜度的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中操作起來(lái)非常簡(jiǎn)單,這樣 Redis可以做很多內(nèi)部復(fù)雜性很強(qiáng)的事情。同時(shí),在磁盤(pán)存儲(chǔ)格式方面它們是緊湊的、以追加的方式產(chǎn)生的,因?yàn)樗鼈儾⒉恍枰M(jìn)行隨機(jī)訪問(wèn)。
使用 Redis 有哪些好處或者優(yōu)勢(shì)?
(1)性能極高。它讀的速度是 11萬(wàn)次/s,寫(xiě)的速度是 8萬(wàn)次/s。因?yàn)閿?shù)據(jù)存在內(nèi)存中,而且是單進(jìn)程單線程IO多路復(fù)用,沒(méi)有創(chuàng)建和銷(xiāo)毀線程的開(kāi)銷(xiāo)。
(2)豐富的數(shù)據(jù)類(lèi)型。
(3)原子性。Redis 的所有操作都是原子性的,多個(gè)操作也支持事務(wù),即通過(guò) MULTI 和 EXEC指令包起來(lái)。
(4)豐富的特性。它還支持 publish/subscribe,緩存,通知和key過(guò)期等特性。
Redis 相比 Memcached 有哪些優(yōu)勢(shì)?
(1)Memcached 所有的值均是簡(jiǎn)單的字符串,redis 作為其替代者,支持更為豐富的數(shù)據(jù)類(lèi)。
(2)Redis 的速度比 Memcached 快。
(3)Redis 可以持久化數(shù)據(jù)。
Memcache 與 Redis 的區(qū)別都有哪些?
(1)存儲(chǔ)方式 Memecache 把數(shù)據(jù)全部存在內(nèi)存之中,斷電后會(huì)掛掉,數(shù)據(jù)不能超過(guò)內(nèi)存大小。 Redis 有部分存在硬盤(pán)上,這樣能保證數(shù)據(jù)的持久性。
(2)數(shù)據(jù)支持類(lèi)型 Memcache 對(duì)數(shù)據(jù)類(lèi)型支持相對(duì)簡(jiǎn)單,而Redis 有復(fù)雜的數(shù)據(jù)類(lèi)型。
(3)使用底層模型不同 它們之間底層實(shí)現(xiàn)方式以及與客戶(hù)端之間通信的應(yīng)用協(xié)議不一樣。 Redis 直接自己構(gòu)建了 VM 機(jī)制 ,因?yàn)橐话愕南到y(tǒng)調(diào)用系統(tǒng)函數(shù)的話,會(huì)浪費(fèi)一定的時(shí)間去移動(dòng)和請(qǐng)求。
Redis 是單進(jìn)程單線程的?
答:Redis 是單進(jìn)程單線程的,redis 利用隊(duì)列技術(shù)將并發(fā)訪問(wèn)變?yōu)榇性L問(wèn),消除了傳統(tǒng)數(shù)據(jù)庫(kù)串行控制的開(kāi)銷(xiāo)。
Redis 的持久化機(jī)制是什么?各自的優(yōu)缺點(diǎn)?
答:Redis提供兩種持久化機(jī)制—— RDB 和 AOF 機(jī)制。
1、RDB(Redis DataBase)持久化方式是指用數(shù)據(jù)集快照的方式半持久化模式記錄 redis 數(shù)據(jù)庫(kù)的所有鍵值對(duì),在某個(gè)時(shí)間點(diǎn)將數(shù)據(jù)寫(xiě)入一個(gè)臨時(shí)文件,持久化結(jié)束后,用這個(gè)臨時(shí)文件替換上次持久化的文件,達(dá)到數(shù)據(jù)恢復(fù)。
優(yōu)點(diǎn):(1)只有一個(gè)文件 dump.rdb,方便持久化。(2)容災(zāi)性好,一個(gè)文件可以保存到安全的磁盤(pán)。(3)性能最大化,fork 子進(jìn)程來(lái)完成寫(xiě)操作,讓主進(jìn)程繼續(xù)處理命令,所以是 IO最大化。使用單獨(dú)子進(jìn)程來(lái)進(jìn)行持久化,主進(jìn)程不會(huì)進(jìn)行任何 IO 操作,保證了 redis的高性能。(4)相對(duì)于數(shù)據(jù)集大時(shí),比 AOF 的啟動(dòng)效率更高。
缺點(diǎn):數(shù)據(jù)安全性低。RDB 是間隔一段時(shí)間進(jìn)行持久化,如果持久化之間 redis 發(fā)生故障,會(huì)發(fā)生數(shù)據(jù)丟失。所以這種方式更適合數(shù)據(jù)要求不嚴(yán)謹(jǐn)?shù)膱?chǎng)景。
2、AOF (Append-only file)持久化方式:是指所有的命令行記錄以 redis 命令請(qǐng)求協(xié)議的格式完全持久化存儲(chǔ),保存為 aof 文件。
優(yōu)點(diǎn):(1)數(shù)據(jù)安全,aof 持久化可以配置 appendfsync 屬性,有 always,每進(jìn)行一次命令操作就記錄到 aof 文件中一次。(2)通過(guò) append 模式寫(xiě)文件,即使中途服務(wù)器宕機(jī),可以通過(guò) redis-check-aof工具解決數(shù)據(jù)一致性問(wèn)題。(3)AOF 機(jī)制的 rewrite 模式。AOF 文件沒(méi)被 rewrite 之前(文件過(guò)大時(shí)會(huì)對(duì)命令進(jìn)行合并重寫(xiě)),可以刪除其中的某些命令(比如誤操作的 flushall)。
缺點(diǎn):(1)AOF 文件比 RDB 文件大,且恢復(fù)速度慢。(2)數(shù)據(jù)集大的時(shí)候,比 RDB 啟動(dòng)效率低。
Redis 常見(jiàn)性能問(wèn)題和解決方案。
答:(1)Master 最好不要寫(xiě)內(nèi)存快照,如果 Master 寫(xiě)內(nèi)存快照,save 命令調(diào)度 rdbSave函數(shù),會(huì)阻塞主線程的工作,當(dāng)快照比較大時(shí)對(duì)性能影響是非常大的,會(huì)間斷性暫停服務(wù)。
(2)如果數(shù)據(jù)比較重要,某個(gè) Slave 開(kāi)啟 AOF 備份數(shù)據(jù),策略設(shè)置為每秒同步一次。
(3)為了主從復(fù)制的速度和連接的穩(wěn)定性,Master 和 Slave 最好在同一個(gè)局域網(wǎng)。
(4)盡量避免在壓力很大的主庫(kù)上增加從庫(kù)。
(5)主從復(fù)制不要用圖狀結(jié)構(gòu),用單向鏈表結(jié)構(gòu)更為穩(wěn)定,即:Master <- Slave1<- Slave2 <- Slave3…這樣的結(jié)構(gòu)方便解決單點(diǎn)故障問(wèn)題,實(shí)現(xiàn) Slave 對(duì) Master的替換。如果 Master 掛了,可以立刻啟用 Slave1 做 Master,其它不變。
redis 過(guò)期鍵的刪除策略是什么?
答:(1)定時(shí)刪除:在設(shè)置鍵的過(guò)期時(shí)間的同時(shí),創(chuàng)建一個(gè)定時(shí)器 timer,讓定時(shí)器在鍵的過(guò)期時(shí)間來(lái)臨時(shí),立即執(zhí)行對(duì)鍵的刪除操作。
(2)惰性刪除:放任鍵過(guò)期不管,但是每次從鍵空間中獲取鍵時(shí),都檢查取得的鍵是否過(guò)期,如果過(guò)期的話,就刪除該鍵;否則,就返回該鍵。
(3)定期刪除:每隔一段時(shí)間程序就對(duì)數(shù)據(jù)庫(kù)進(jìn)行一次檢查,刪除里面的過(guò)期鍵。至于要?jiǎng)h除多少過(guò)期鍵,以及要檢查多少個(gè)數(shù)據(jù)庫(kù),則由算法決定。
以上就是“進(jìn)階學(xué)習(xí)的redis常見(jiàn)面試題匯總”,你能回答上來(lái)嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743