1. 程式人生 > 其它 >Redis相關面試題

Redis相關面試題

1、Redis持久化機制:RDB和AOF?

原因:redis是記憶體儲存,斷電丟失資料,所以需要資料持久化。

非同步執行緒、fork、copy on write、系統io、fsync

RDB:指定時間間隔內觸發頻率,對資料進行快照儲存。

  儲存rdb檔案是父程序fork子程序來完成,最大化redis的效能

  丟失資料多

AOF:每次對伺服器寫操作會追加日誌記錄,伺服器重啟時會執行日誌檔案中命令來恢復資料。

  最多丟失1s資料

  aof體積過大時,自動對aof重寫,新aof檔案包含恢復當前資料集所需的最小集合命令。

  新版本優化重寫檔案時,資料以rdb的形式追加aof頭部,重寫後的aof已然追加的是日誌,但是恢復時先rdb再增量日誌,效能更優秀。(先巨集觀再補微觀)

若資料只在伺服器執行的時候做箇中間快取,可以不適用任何持久化方式

也可以同時開啟2中持久化方式,預設優先aof,資料更加完整。

2、redis的過期鍵有哪些刪除策略?

時間過期是使用Unix時間戳儲存,絕對時間點,相對時間點。時鐘輪演算法。

過期方式:被動和主動。

客戶端訪問時,key發現並主動過期(被動);定時隨機測試keys過期時間,過期的刪除(主動)。

3、redis叢集方案有哪些?

常見叢集:主從複製叢集,分片叢集

redis:主從複製叢集(手動切換),哨兵HA主從複製叢集(自動)

4、redis事務是如何實現的?

事務是一個單獨的隔離操作,事務中所有命令都會序列化、按順序執行。事務執行中不會被其他命令打斷。

事務是原子操作。全部執行(有些會失敗)或全部不執行

multi 開啟事務

命令列入隊

exec 執行|discard 回滾

為什麼Redis不支援回滾?

事務執行失敗時不回滾,繼續執行下個命令。

失敗的命令是由程式設計錯誤造成,而這些錯誤開發過程中就應被發現,而不應該出現在生產環境中。
回滾並不能解決程式設計錯誤帶來的問題,如自增。因為不需要回滾支援,所以redis內部簡單且快速。

鑑於沒有任何機制能避免程式設計師自己造成的錯誤,並且這類錯誤通常不會在生產環境出現,所以Redis選擇了更簡單、更快速的無回滾方式處理事務。

5、Redis主從複製的原理?

讀寫分離,master主機寫,slave讀。使用非同步複製,非阻塞的,非一致性的

6、快取穿透、快取擊穿、快取雪崩、預熱的解決方案?

快取穿透:查詢不存在的資料(redis和資料庫都沒),不存在不寫入快取,不存在的資料每次請求都要查詢儲存層,失去快取意義,大流量下DB可能掛掉。

  解決方案:布隆過濾器,將可能存在的hash到一個足夠大的bitmap中,一定不存在的資料會被bitmap攔截掉,避免了對底層資料庫的查詢壓力;快取空結果,設定較短的過期時間。

快取擊穿:過期的熱點資料key某些時間點被大量併發的訪問,衝擊資料庫。

  解決方案:  1.設定熱點資料永不過期(因為滿了會預設隨機清理設定時間的快取資料)
        2.加互斥鎖(分散式鎖):每個key同時只有一個執行緒去查詢後端服務

快取雪崩:key大面積失效,衝擊資料庫

  解決方案:失效時間在原有基礎上增加隨機值,使失效時間均勻分佈

總結:都是快取不存在下,高併發的請求。可以使用限流的互斥鎖,保障資料庫穩定執行。