1. 程式人生 > >Redis系列(七)Redis面試題

Redis系列(七)Redis面試題

**Redis 系列:** 1. [Redis系列(一)Redis入門](https://blog.itzhouq.cn/redis1) 2. [Redis系列(二)Redis的8種資料型別](https://blog.itzhouq.cn/redis2) 3. [Redis系列(三)Redis的事務和Spring Boot整合](https://blog.itzhouq.cn/redis3) 4. [Redis系列(四)Redis配置檔案和持久化](https://blog.itzhouq.cn/redis4) 5. [Redis系列(五)釋出訂閱模式、主從複製和哨兵模式](https://blog.itzhouq.cn/redis5) 6. [Redis系列(六)Redis 的快取穿透、快取擊穿和快取雪崩](https://blog.itzhouq.cn/redis6) 7. [Redis系列(七)Redis面試題](https://blog.itzhouq.cn/redis7) 8. [Redis命令參考](http://redisdoc.com/index.html) ## [1、什麼是 Redis?有什麼特點?](https://blog.itzhouq.cn/redis1) Redis 是一款開源,高效能的 key-value 的非關係型資料庫。 **特點**: 1)支援持久化,可以將記憶體中的資料持久化到磁碟,重啟可以再次從磁碟中載入使用; 2)支援多種資料結構; 3)支援資料的備份:主從模式的備份; 4)高效能,讀速度達 11 萬次/秒,寫速度達到 8.1 萬次/秒 5)支援事務。 ## 2、[說說 Redis 的資料型別](https://blog.itzhouq.cn/redis2) 一共 8 種 5 種基本資料型別:String、Hash、List、Set、Zset 3 種特殊型別:geospatial、hyperloglog、bitmap ## 3、Redis 和 Memcache 的區別? 1)Memcache 資料都儲存在記憶體中,斷電即失,資料不能超過記憶體大小;而 Redis 的資料可以持久化到硬碟。 2) Memcache 只支援簡單的字串,Redis 有豐富的資料結構; 3)底層實現方式不一樣,Redis 自行構建了 VM 機制,速度更快。 ## 4、Redis 是單程序單執行緒的? Redis 將資料放在記憶體中,單執行緒執行最高,多執行緒執行反而需要進行 CPU 上下文切換,這是個耗時操作,單執行緒效率最高。 ## 5、[說說 Redis的持久化](https://blog.itzhouq.cn/redis4) Redis 提供了兩種持久化機制:RDB 和 AOF RDB 持久化機制指的是,用資料集快照的方式記錄 Redis 資料庫的所有鍵值對,在某個時間點寫入一個臨時檔案,持久化結束後,用這個臨時檔案替換上次持久化的檔案,達到資料恢復的目的。 **優點**: 1)只有一個檔案 dump.rdb 方便持久化; 2)容災性好,一個檔案可以儲存到安全的磁碟; 3)效能最大化,Redis 會單獨建立(fork)一個子程序進行持久化,主程序不進行任何 IO 操作,保證了效能; 4)在資料較多時,比 AOF 的啟動效率高。 **缺點**: 最後一次持久化的資料可能會丟失。 AOF 持久化,是以獨立日誌的方式記錄每次寫命令,並在 Redis 重啟時重新執行 AOF 檔案中的命令以達到恢復資料的目的。AOF 主要解決資料持久化的實時性。 **優點**: 1)資料安全,配置 appendfsync 屬性,可以選擇不同的同步策略; 2)自動修復功能, redis-check-aof工具可以解決資料一致性問題; **缺點**: 1)AOF 檔案比 RDB 檔案大,且恢復速度慢; 2)資料多時,效率低於 RDB。 ## 6、[Redis 的主從複製](https://blog.itzhouq.cn/redis5#toc_h2_1) 主從複製值的是將一臺 Redis 伺服器的資料複製其他 Redis 伺服器,前者稱之為主節點,後者稱之為從節點。 **主從複製的作用**: 1)資料冗餘:主從複製實現了資料的熱備份; 2)故障修復:當主節點出現故障後,從節點還可以提供服務,實現快速的故障修復。 3)負載均衡:在主從複製的基礎上,配合讀寫分離,可以由主節點提供寫操作,從節點提供讀操作,實現負載均衡,提高併發量; 4)高可用的基石:主從複製是哨兵模式的基礎。 **複製原理**: 從節點啟動成功連線到主節點後,會發送一個 sync 的同步命令。主節點接收到命令之後,啟動後臺的存檔程序,收集所有修改資料庫的命令,在後臺執行完畢後將整個資料檔案傳送到從節點,完成一次完全同步。 **全量複製**:從節點在接收到了資料檔案後,將其存檔檔案載入都記憶體中; **增量複製**:主節點繼續將新收集到修改命令傳遞給從節點,完成同步。 ## 7、[說說哨兵模式](https://blog.itzhouq.cn/redis5) 哨兵模式是為了解決手動切換主節點的問題。Redis 提供了哨兵的命令,哨兵是一個**獨立的程序**。哨兵能夠後臺監控主節點是否故障,如果故障需要將從節點選舉為主節點。 其原理是哨兵通過傳送命令,等待 Redis 伺服器的響應,從而監控多個 Redis 節點。 當只有一個哨兵時,還是可能會出現問題的,比如哨兵自己掛掉。為此,可以使用多哨兵模式,多個哨兵之間相互監控。當主節點宕機了,哨兵1先檢測到這個結果,系統並不會馬上進行 failover 【故障轉移】的過程。僅僅是哨兵1認為主節點不可用的現象稱之為**主觀下線**。當其餘的哨兵也檢測到主節點不可用之後,哨兵之間會進行一次投票選舉從節點中的一個作為新的主節點,這個過程稱之為**客觀下線**。 **哨兵模式的優點**: 1)基於主從複製,高可用; 2)主從可以切換,進行故障轉移,系統可用性好; 3)哨兵模式是主從模式的升級版,手動到自動,更加健壯。 **哨兵模式的缺點**: 1)不方便線上擴容; 2)實現哨兵模式需要很多的配置。 ## 8、[快取穿透、快取擊穿和快取雪崩](https://blog.itzhouq.cn/redis6) ### 快取穿透: **概念**:使用者需要查詢一個數據,快取中沒有,也就是沒有命中,於是向資料庫中發起請求,發現也沒有。當用戶很多的時候,快取都沒有命中,於是都去請求資料庫,這給資料庫造成很大的壓力。 **解決方案**: - 布隆過濾器:是一種資料結構,對所有可能查詢的引數以 hash 方式儲存,先在控制層進行校驗,不符合則丟棄,避免了過多訪問資料庫。 - 快取空物件:當儲存層沒有命中時,即使返回空物件也將其快取起來。(意味著更多的空間儲存,即使設定了過期時間,快取和資料庫還是有段時間資料不一致。) ### 快取擊穿: **概念**:當一個 key 非常熱點時,在不斷扛高併發,集中對這個熱點資料進行訪問,當這個 key 失效的瞬間,請求直接到達資料庫,給資料庫瞬間的高壓力。 **解決方案**: - 設定熱點資料永不過期 - 加分散式鎖:保證每個 key 同時只有一個執行緒去查詢後端服務。 ### 快取雪崩: **概念**:某個時間段,快取集中失效 **解決方案**: - 增加 Redis 叢集的數量 - 限流降級:在快取失效後,通過加鎖和佇列來控制資料庫寫快取的執行緒數量 - 資料預熱:正式部署之前,將資料預先訪問一遍,讓快取失效的時間儘量均勻 ## 9、Redis 的使用場景 1)會話快取:如 單點登入,使用 Redis 模擬 session,SSO 系統生成一個 token,將使用者資訊存到 Redis 中,並設定過期時間; 2)全頁快取 3)作為訊息佇列平臺 4)排行榜和計數器 5)釋出/訂閱:比如聊天系統 6)熱點資料:比如ES中搜索的熱詞 ## 10、Redis 快取如何保持一致性 讀資料的時候首先去 Redis 中讀取,沒有讀到再去 MySQL 中讀取,讀取都資料更新到 Redis 中作為下一次的快取。 寫資料的時候會產生資料不一致的問題。無論是先寫入 Redis 再寫入 MySQL 中,還是先寫入 MySQL 再寫入 Redis 中,這兩步操作**都不能保證原子性**,所以會出現 Redis 和 MySQL 中資料不一致的問題。 **無論採取何種方式都不能保證強一致性**,如果對 Redis 中的資料設定了**過期時間,能夠保證最終一致性**,對架構的優化只能降低發生的概率,不能從根本上避免不一致性。 更新快取的兩種方式:刪除失效快取、更新快取 更新快取和資料庫有兩種順序:先資料庫後快取、先快取後資料庫 兩兩組合,分為四種更新