自身經驗--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
如果想看看,這裏有一個鏈接,也是關於面試經驗的。