Java面試:13個Redis面試題,你能答對幾個?

01 什麼是 Redis?

Redis 本質上是一個 Key-Value 類型的內存數據庫,很像 memcached,整個數據庫統統加載在內存當中進行操作,定期通過異步操作把數據庫數據 flush 到硬盤上進行保存。因爲是純內存操作,Redis 的性能非常出色,每秒可以處理超過 10 萬次讀寫操作,是已知性能最快的 Key-Value DB。 Redis 的出色之處不僅僅是性能,Redis 最大的魅力是支持保存多種數據結構,此外單個 value 的最大限制是 1GB,不像 memcached 只能保存 1MB 的數據,因此 Redis 可以用來實現很多有用的功能,比方說用他的 List 來做 FIFO 雙向鏈表,實現一個輕量級的高性 能消息隊列服務,用他的 Set 可以做高性能的 tag 系統等等。另外 Redis 也可以對存入的 Key-Value 設置 expire 時間,因此也可以被當作一 個功能加強版的 memcached 來用。 Redis 的主要缺點是數據庫容量受到物理內存的限制,不能用作海量數據的高性能讀寫,因此 Redis 適合的場景主要侷限在較小數據量的高性能操作和運算上。

小編整理了一個Redis學習筆記,有需要的朋友可以私信【Redis】免費領取

Java面試:13個Redis面試題,你能答對幾個?

 

02 Redis 有哪些數據結構?

字符串 String、字典 Hash、列表 List、集合 Set、有序集合 SortedSet。

如果你是 Redis 中高級用戶,還需要加上下面幾種數據結構 HyperLogLog、Geo、Pub/Sub。

如果你說還玩過 Redis Module,像 BloomFilter,RedisSearch,Redis-ML,面試官得眼睛就開始發亮了。

03 Redis 爲什麼是單線程的?

因爲 CPU 不是 Redis 的瓶頸。Redis 的瓶頸最有可能是機器內存或者網絡帶寬。(以上主要來自官方 FAQ)既然單線程容易實現,而且 CPU 不會成爲瓶頸,那就順理成章地採用單線程的方案了。關於 redis 的性能,官方網站也有,普通筆記本輕鬆處理每秒幾十萬的請求,

04 使用 Redis 有哪些好處?

(1) 速度快:因爲數據存在內存中,類似於 HashMap,HashMap 的優勢就是查找和操作的時間複雜度都是 O (1)

(2) 支持豐富數據類型:支持 string,list,set,sorted set,hash

(3) 支持事務:操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行

(4) 豐富的特性:可用於緩存,消息,按 key 設置過期時間,過期後將會自動刪除

05 Redis 相比 memcached 有哪些優勢?

(1) memcached 所有的值均是簡單的字符串,redis 作爲其替代者,支持更爲豐富的數據類型

(2) redis 的速度比 memcached 快很多

(3) redis 可以持久化其數據

(4) Redis 支持數據的備份,即 master-slave 模式的數據備份。

(5) 使用底層模型不同

它們之間底層實現方式 以及與客戶端之間通信的應用協議不一樣。

Redis 直接自己構建了 VM 機制 ,因爲一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。

(6)value 大小:redis 最大可以達到 1GB,而 memcache 只有 1MB

06 使用過 Redis 分佈式鎖麼,它是什麼回事?

先拿 setnx 來爭搶鎖,搶到之後,再用 expire 給鎖加一個過期時間防止鎖忘記了釋放。

如果在 setnx 之後執行 expire 之前進程意外 crash 或者要重啓維護了,那會怎麼樣?

這時候你要給予驚訝的反饋:唉,是喔,這個鎖就永遠得不到釋放了。緊接着你需要抓一抓自己得腦袋,故作思考片刻,好像接下來的結果是你主動思考出來的,然後回答:我記得 set 指令有非常複雜的參數,這個應該是可以同時把 setnx 和 expire 合成一條指令來用的!

07 Redis 如何做持久化的?

bgsave 做鏡像全量持久化,aof 做增量持久化。因爲 bgsave 會耗費較長時間,不夠實時,在停機的時候會導致大量丟失數據,所以需要 aof 來配合使用。在 redis 實例重啓時,會使用 bgsave 持久化文件重新構建內存,再使用 aof 重放近期的操作指令來實現完整恢復重啓之前的狀態。

(1)對方追問那如果突然機器掉電會怎樣?

取決於 aof 日誌 sync 屬性的配置,如果不要求性能,在每條寫指令時都 sync 一下磁盤,就不會丟失數據。但是在高性能的要求下每次都 sync 是不現實的,一般都使用定時 sync,比如 1s1 次,這個時候最多就會丟失 1s 的數據。

(2)對方追問 bgsave 的原理是什麼?

你給出兩個詞彙就可以了,fork 和 cow。fork 是指 redis 通過創建子進程來進行 bgsave 操作,cow 指的是 copy on write,子進程創建後,父子進程共享數據段,父進程繼續提供讀寫服務,寫髒的頁面數據會逐漸和子進程分離開來。

08 假如 Redis 裏面有 1 億個 key,其中有 10w 個 key 是以某個固定的已知的前綴開頭的,如果將它們全部找出來?

使用 keys 指令可以掃出指定模式的 key 列表。

對方接着追問:如果這個 redis 正在給線上的業務提供服務,那使用 keys 指令會有什麼問題?

這個時候你要回答 redis 關鍵的一個特性:redis 的單線程的。keys 指令會導致線程阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復。這個時候可以使用 scan 指令,scan 指令可以無阻塞的提取出指定模式的 key 列表,但是會有一定的重複概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用 keys 指令長。

09 如果有大量的 key 需要設置同一時間過期,一般需要注意什麼?

如果大量的 key 過期時間設置的過於集中,到過期的那個時間點,redis 可能會出現短暫的卡頓現象。一般需要在時間上加一個隨機值,使得過期時間分散一些。

10 Redis 的同步機制瞭解麼?

Redis 可以使用主從同步,從從同步。第一次同步時,主節點做一次 bgsave,並同時將後續修改操作記錄到內存 buffer,待完成後將 rdb 文件全量同步到複製節點,複製節點接受完成後將 rdb 鏡像加載到內存。加載完成後,再通知主節點將期間修改的操作記錄同步到複製節點進行重放就完成了同步過程。

11 Redis 爲什麼這麼快?

純內存數據庫,避免了磁盤 I/O 的瓶頸。

單進程單線程,減少了線程上下文切換的開銷。

利用隊列技術將並行訪問變爲串行訪問,消除了傳統數據庫併發訪問控制鎖的開銷。

Redis 全程使用 hash 結構,讀取速度快,還有一些特殊的數據結構,對數據存儲進行了優化,如壓縮表,對短數據進行壓縮存儲,再如,跳錶,使用有序的數據結構加快讀取的速度。

使用多路 I/O 複用模型,非阻塞 I/O。

12 多路 I/O 複用模型

多路 I/O 複用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閒的時候,會把當前線程阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,於是程序就會輪詢一遍所有的流(epoll 是隻輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。

這裏 “多路” 指的是多個網絡連接,“複用” 指的是複用同一個線程。採用多路 I/O 複用技術可以讓單個線程高效的處理多個連接請求(儘量減少網絡 IO 的時間消耗),且 Redis 在內存中操作數據的速度非常快,也就是說內存內的操作不會成爲影響 Redis 性能的瓶頸,主要由以上幾點造就了 Redis 具有很高的吞吐量。

13 Redis 持久化方式

(1)RDB 持久化

redis 提供了 RDB 持久化的功能,這個功能可以將 redis 在內存中的的狀態保存到硬盤中,它可以手動執行,也可以再 redis.conf 中配置,定期執行。RDB 持久化產生的 RDB 文件是一個經過壓縮的二進制文件,這個文件被保存在硬盤中,redis 可以通過這個文件還原數據庫當時的狀態。

(2)AOF 持久化

AOF 持久化(Append-Only-File),與 RDB 持久化不同,AOF 持久化是通過保存 Redis 服務器鎖執行的寫狀態來記錄數據庫的。具體來說,RDB 持久化相當於備份數據庫狀態,而 AOF 持久化是備份數據庫接收到的命令,所有被寫入 AOF 的命令都是以 redis 的協議格式來保存的。在 AOF 持久化的文件中,數據庫會記錄下所有變更數據庫狀態的命令,除了指定數據庫的 select 命令,其他的命令都是來自 client 的,這些命令會以追加 (append) 的形式保存到文件中。

(3)對比

AOF 更安全,可將數據及時同步到文件中,但需要較多的磁盤 IO,AOF 文件尺寸較大,文件內容恢復相對較慢,也更完整。

RDB 持久化,安全性較差,它是正常時期數據備份及 master-slave 數據同步的最佳手段,文件尺寸較小,恢復數度較快。

下面是一個Redis的學習導圖,需要下載原圖以及領取更多學習導圖(Java,kafka,redis,docker,spring,MySQL,mybatis...)的朋友可以私信【Redis】,按照回覆操作,免費領取哦~

Java面試:13個Redis面試題,你能答對幾個?

Redis

Java面試:13個Redis面試題,你能答對幾個?

學習導圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章