面試系列之緩存篇

Redis有哪些數據類型?

五大數據類型:string、hash、list、set、sorted set

 

Redis主從複製的過程?

  • slave與master建立連接,發送sync同步命令

  • master會開啓一個後臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存

  • 後臺完成保存後,將文件發送給slave

  • slave將此文件保存到硬盤上,並載入數據庫

 

Redis主節點宕機了怎麼辦,還有沒有同步的數據怎麼辦?

爲了避免主節點宕機帶來的數據丟失,所以主節點也需要實現高可用,一般在集羣中應當避免主節點單點問題;儘量搭建多主多從的集羣模式

 

聊聊Redis緩存穿透,緩存雪崩和緩存擊穿?

  • 緩存穿透:指的是當查詢一個不存在的key時或者數據庫根本不存在的數據時,因爲Redis緩存當Key不命中時就會去請求DB查詢數據,所有當一個不存在的Key被訪問時,每次都會去請求直接請求DB,這就叫緩存穿透;

  • 緩存雪崩:當key的失效時間集中在某一時刻,就會造成大量的緩存穿透,而此時壓力就會全部落到數據庫上,可能導致數據庫無法承受,造成整個應用服務崩潰,這種情況就叫緩存雪崩,大量緩存穿透會導致緩存雪崩;

  • 緩存擊穿:指對於某些熱點key數據(即經常被大量訪問的key),如果在某個時間點該key緩存失效了,則造成大量的訪問直接落向DB,可能直接將DB擊垮,這種現象就叫緩存擊穿;

三者的區別:緩存穿透是指訪問一個一定不存在的數據,緩存雪崩指的是對於多個key,不一定是熱點數據緩存集中失效時造成的DB宕機,緩存擊穿和緩存雪崩有點像,但是不同的是緩存擊穿針對的是某些熱點key,緩存擊穿和緩存穿透都將導致緩存雪崩

 

如何使用Redis來實現分佈式鎖?

  • 獲取鎖的時候,使用setnx加鎖,並使用expire命令爲鎖添加一個超時時間,超過該時間則自動釋放鎖,鎖的value值爲一個隨機生成的UUID,用於釋放鎖的時候進行判斷。

  • 獲取鎖的時候還設置一個獲取的超時時間,若超過這個時間則放棄獲取鎖。

  • 釋放鎖的時候,通過UUID判斷是不是該鎖,若是該鎖,則執行delete進行鎖釋放

 

Redis的緩存失效策略?

惰性刪除+定期刪除

惰性刪除:在進行get或者setnx等操作時,先檢查key是否過期,如果過期則刪除key,然後執行相應操作,如果沒有過期則執行相應操作;

定期刪除(簡單而言,對指定個數個庫的每一個庫隨機刪除小於等於指定個數個過期key):遍歷每個數據庫(就是redis.conf中配置的"database"數量,默認爲16),檢查當前庫中的指定個數個key(默認是每個庫檢查20個key,注意相當於該循環執行20次,循環體時下邊的描述),如果當前庫中沒有一個key設置了過期時間,直接執行下一個庫的遍歷,隨機獲取一個設置了過期時間的key,檢查該key是否過期,如果過期,刪除key,判斷定期刪除操作是否已經達到指定時長,若已經達到,直接退出定期刪除;

 

Redis是單線程還是多線程的?

單線程,redis的瓶頸並不是CPU而是機器內存或者網絡帶寬,既然不是CPU不是瓶頸,單線程又容易實現,所以Redis採用單線程的方案了;

Redis操作是不是原子性的?

由於Redis都是單線程處理每個任務,所以很顯然是原子性的;

 

Redis有沒有事務?事務操作中又是如何保證原子操作?

Redis有一個弱事務處理,本質上是一個批處理,命令multi開啓事務,然後每個命令請求會被放入一個隊列,當執行exec時,進行批量提交,批處理也是從隊列一個個按順序執行,而且是一起成功或者一起失敗,也是原子性操作;

 

Redis的跳躍表有了解嗎?

跳躍表skiplist:是一種有序的數據結構, 它通過在每個節點中維持多個指向其他節點的指針,從而達到快速訪問節點的目的;

Redis使用跳躍表來作爲有序集合鍵的底層實現,Redis中跳躍表僅僅在有序結合這裏和集羣中作爲節點內部數據結構使用,其他地方都沒有用到;

 

Redis的發佈訂閱有熟悉嗎?

發佈者將消息發佈發佈到channel頻道上,所有訂閱了channel頻道的客戶端都會接收到消息,這是一種廣播的消息模式;

 

Redis持久化知道怎麼做嗎?

2種方式:RDB(生成快照)和AOF(日誌追加)

RDB:Redis在內存中的數據庫記錄定時dump到磁盤上,生成一個RDB文件;rdb每隔一段時間記錄備份一次數據庫數據,所以會存在數據丟失的情況;

AOF:AOF是一種以日誌的形式記錄redis服務器所處理的每一個寫和刪除命令,查詢不會記錄,整個過程會將Reids的操作日誌以追加的方式寫入aof文件;aof每個寫命令都會被記錄下來,並且同步寫到aof文件,所以運行效率比較低,更何況redis還是單線程的,會造成redis停頓;

RDB是通過配置文件配置持久化策略,每隔N秒操作M次就進行持久化;

AOF是三種策略模式,每隔一秒持久化一次,每發生一個寫命令持久化一次和用不持久化;

 

Redis如何實現高可用?

主從複製、哨兵,集羣

主從複製過程

  • slave與master建立連接,發送sync同步命令;

  • master會開啓一個後臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存;

  • 後臺完成保存後,將文件發送給slave;

  • slave將此文件保存到硬盤上

哨兵:相當於一個站崗放哨的士兵,他能監測主服務器和從服務器的狀態,當主服務器宕機時,他會從該主對應的從服務器列表中,通過投票選舉機制完成新主服務器的選舉工作,當新的主服務器產生之後,之前的從服務器就重新認主,相當於找到了新的老大,然後之前宕機的主服務器恢復啓動之後,也會被歸爲新主服務器的從服務器;

集羣:3.0版本之後正式支持集羣,3.0之前高可用都只能使用哨兵來搭建

  • 節點:Redis集羣中一個個獨立的Redis服務器,他們之間獨立部署通過集羣產生關聯,節點又分爲主節點和從節點,每個從節點與自己的主節點關聯,多個主節點之間又相互關聯組成集羣;

  • 槽(slot):Redis集羣通過分片的方式來保存緩存數據庫中的鍵值對,集羣的整個數據庫被分爲16384個槽,每個key對應其中的一個槽,集羣中的每個節點可以處理0個或者最多16384個槽;

  • 集羣狀態:當每個槽都被分配完畢,集羣就處於上線狀態,否則就處於下線狀態;

  • 重新分片:當集羣中新增主節點時,集羣就會進行重新分片,將槽重新劃分,並且槽所對應的數據也一起劃分,該操作可以在線進行,集羣不需要下線,而且在這個過程中,每個節點還能繼續處理客戶端的請求

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