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大面積失效,衝擊資料庫
解決方案:失效時間在原有基礎上增加隨機值,使失效時間均勻分佈
總結:都是快取不存在下,高併發的請求。可以使用限流的互斥鎖,保障資料庫穩定執行。