更新時間:2022-12-30 11:43:03 來源:動力節(jié)點 瀏覽1833次
很多大廠都在使用redis,所以今天小編當作搬運工,為大家整理了一份Redis面試題,合計了10個題目,還算是比較全,題目涵蓋基礎(chǔ)題和高級題。希望對各位讀者有所幫助,祝大家前程似錦。

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