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