1. 程式人生 > >自身經驗--Redis的秋招面經(一)

自身經驗--Redis的秋招面經(一)

今天去一家公司面試,由於在簡歷裡面有寫到專案中使用到了Redis,所以面試官就抓著這個問題問了好多知識點,我每個問題都有回答到,但是自己是覺得有的答案不太完整,所以面試結束,針對問題,整理一份文件。

主要分成三個部分: 第一是面試問到的問題。 第二個是根據面試過程中的體驗總結的一些面試經驗,可能有的不太正確,請大家見諒和改正。 第三部分就是問題的相關答案。

-----------------------------------------開始表演了-------------------------------------------------

一、你的專案中使用到了Redis,為什麼要使用這個?

問題解析:一般這種問題就是在問,Redis相比較其他的資料庫有什麼好處,使用Redis對你的專案有什麼幫助,一定要結合專案來說,這樣子顯得對Redis的體驗更深。面試官的問題回答完之後可以再稍微表現一下自己,說一些關於Redis的其他特徵。

面試答案:我的專案是一個類似於噹噹網的圖書平臺【結合自身專案去說】,裡面每個頁面都有好多的圖片需要進行快速載入,對效能要求很高,但資料量大,大概有30000+【好像也不太多】,如果純粹使用資料庫,效能會有問題,使用redis來分擔部分效能壓力,將圖片資料儲存到redis中,頁面展示等依舊是資料庫,需要高效查詢的部分使用redis,提高效率。除此之外,在接觸到Redis之後,還發現了Redis其他的優勢,比如: (1) 速度快,因為資料存在記憶體中,類似於HashMap,HashMap的優勢就是查詢和操作的時間複雜度都是O(1) (2) 支援豐富資料型別,有5個不同的資料型別 (3) 支援事務,操作都是原子性,所謂的原子性就是對資料的更改要麼全部執行,要麼全部不執行 (4) 豐富的特性:可用於快取,訊息,按key設定過期時間,過期後將會自動刪除

二、說一下Redis的資料結構?

問題解析:我剛聽到這個問題,第一反應是key-value,但是想想在上一個問題裡面說過了,不可能是問這個,所以就回答了Redis的五種資料型別,結果看面試官的反應,我的猜測是正確的。【如果不放心的寶寶可以先回答Redis的key-value,再回答五種型別,以防萬一

面試答案:腦子裡面記住這張圖,大概說一下,就沒什麼問題了。 在這裡插入圖片描述

三、Redis的持久化了解過沒有?

問題解析:這個問題就很顯而已懂,闡述一下Redis的持久化。但是如果可以從Redis存在持久化特徵的原因開始說起,再到怎麼去實現持久化,會更好一點。

面試答案:由於Redis的資料都存放在記憶體中,如果沒有配置持久化,redis重啟後資料就全丟失了,於是需要開啟redis的持久化功能,將資料儲存到磁 盤上,當redis重啟後,可以從磁碟中恢復資料。 redis提供兩種方式進行持久化,一種是RDB持久化(原理是將Reids在記憶體中的資料庫記錄定時 dump到磁碟上),另外一種是AOF持久化(原理是將Reids的操作日誌以追加的方式寫入檔案)。

四、那你說的這兩個方式分別是怎麼實現的?

問題解析:問到這個問題,有種自己挖坑給面試官跳,結果他還跳進去感覺,感覺賊爽了【前提是對於這兩種方式,是真的可以說出來中間的過程和不同點,不然就是自己挖坑自己跳,還給裡面放了毒針】 如果想更深一點了解這個問題,可以看看這個連結,覺得寫的不錯

面試答案:RDB持久化是指在指定的時間間隔內將記憶體中的資料集快照寫入磁碟,實際操作過程是單獨分一個子程序,先將資料集寫入臨時檔案,寫入成功後,再替換之前的檔案,用二進位制壓縮儲存。 AOF持久化以日誌的形式記錄伺服器所處理的每一個寫、刪除操作,查詢操作不會記錄,以文字的方式記錄,可以開啟檔案看到詳細的操作記錄。個人覺得這個比較省事。

五、在專案中遇到redis效能問題了嗎?

問題解析:我的專案不大,雖然上線了,但是訪問的人也不多,人貴在自知之明嘛,所以也不太可能出現什麼效能問題,但是該瞭解的還是需要了解的,資料得看呀。建議各位寶寶面試中實話實說,沒有遇到就沒有遇到,知道的就知道,不知道就說我瞭解的就這麼多了,千萬不能亂說,面試官都是抗戰一線的,當然一眼就可以看出來了。 面試答案:我的專案中暫時沒有遇到效能問題,不過我下來之後在學習Redis的時候,看到過一篇部落格,寫的很好,大概內容就是:

(1) Master最好不要做任何持久化工作,如RDB記憶體快照和AOF日誌檔案

(2) 如果資料比較重要,某個Slave開啟AOF備份資料,策略設定為每秒同步一次

(3) 為了主從複製的速度和連線的穩定性,Master和Slave最好在同一個區域網內

(4) 儘量避免在壓力很大的主庫上增加從庫

(5) 主從複製不要用圖狀結構,用單向連結串列結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3…

這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。

六、Redis的應用Key很大,如何取出特定的key呢?

問題解析:個人覺得這種問題是一個分界點,如何在大量的資料中取出特定的一位,不僅和演算法有關係也和資料結構有關係,所以這個問題一般問的挺多的,朋友遇到過幾個,我沒遇到過,可能運氣不太好。由於Redis的資料結構有五種,所以就應該從五種不同的角度出發去說這個問題,還可以顯得思維嚴謹。 面試答案:一般取出特定的key,每個資料結構都有各自的特色,所以我打算從五個方面分貝說起。【能說多少說多少】 (一)Sting字串 Redis Get 命令用於獲取指定 key 的值。如果 key 不存在,返回 nil 。如果key 儲存的值不是字串型別,返回一個錯誤。 (二)hash Redis Hget 命令用於返回雜湊表中指定欄位的值。如果給定的欄位或 key 不存在時,返回 nil 。 (三)list列表 Redis Lindex 命令用於通過索引獲取列表中的元素。 如果指定索引值不在列表的區間範圍內,返回 nil 。還可以使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。 (四)Set集合 Redis Sinter 命令返回給定所有給定集合的交集。 不存在的集合 key 被視為空集。 當給定集合當中有一個空集時,結果也為空集(根據集合運算定律)。 (五)ZSet 有序集合 如果成員是有序集 key 的成員,返回 member 的排名。 如果成員不是有序集 key 的成員,返回 nil 。

-----------------------------------------拜拜------------------------------------------------------------ 好啦,今天的分享就先寫到這裡,因為真的面試官就轉到資料結構哪裡去了,開始問HashMap 如果想看看,這裡有一個連結,也是關於面試經驗的。