面试官:能说说Redis的持久化机制吗?
我們先來看這么一段面試場景——
面試官:你們項目緩存技術用到了什么緩存技術?
小帥:Redis
面試官:那么問一下,Redis緩存技術用到的持久化機制是哪一種機制?
小帥:AOF
面試官:好吧,回去等通知吧……
這個問題,不知道你在面試的時候有沒有被別人問過,你是怎么回答的?
其實不管你怎么回答都是錯的,為什么?請往下看。
大家都知道,Redis是我們互聯網公司必用的架構技術,在我們業內稱之為高性能緩存數據庫,那么既然是緩存,我們的系統、服務器一斷電或重啟的時候,它的數據一定會丟失,所以,在丟失的這個過程中,在丟失之前,Redis做了一套持久化機制。
1、什么叫持久化機制?
我們往Redis插數據的時候,這個數據會同步一份保存到磁盤,而保存到磁盤有兩種方式,對應兩種數據文件格式:AOF和RDB這兩種文件,在Redis從斷電到開機的瞬間都可以讓我們的數據從磁盤恢復到Redis。
那么問題來了,小帥要回答面試官講的這個問題,其實是要搞明白AOF和RDB兩者的區別。
RDB是Redis的一個快照文件,那什么叫快照?
比如說現在的時間是下午14:00,Redis做了一次快照的備份,把這個數據備份到了RDB,那么這個RDB文件的數據就只停留在下午兩點,下午兩點以后的數據RDB是沒有的,因為它相當于一個冷備,備份的時間只停留在下午兩點鐘這個時刻的快照。
所以,你如果回答的是RDB,它的數據一定會有丟失。
除了RDB,第二個方式就是剛才小帥回答的AOF,那AOF有什么問題呢?
當我們往Redis里不斷插入數據,它會以日志的方式追加(Append)到AOF文件里,也就是說AOF里面記錄了很多這種原始的操作語句,比如說set、hset等等,當我們使用AOF恢復數據到Redis的時候,它會重新執行一遍我們之前操作的所有操作語句。
這里我舉個例子:
第一條 > set name 小帥
第二條 > set name 小美
第三條 > set name 佛波勒
以上三條語句都追加到了AOF文件里,很明顯,此刻如果我們執行get name,Redis返回的是“佛波勒”,那么問題來了,AOF存了這么多過程化的數據,或者說是中間數據,它的意義在哪里?
沒有意義!
因為最終Redis恢復的時候最終的數據是“佛波勒”,哪怕Redis把前兩條數據恢復了,在最后name被恢復的時候,也會被“佛波勒”覆蓋,所以前兩條數據是不可取的,浪費了我們的空間,那樣咱們的AOF文件會越變越大。
所以Redis是怎么做的呢,AOF里還有個技術叫Rewrite壓縮重寫,當我們的AOF文件不斷變大的時候,比如我們設置的閥值是64M,當AOF文件第一次到達64M的時候,Redis會自動觸發一次Rewrite操作,將AOF文件進行一次瘦身。
接下來,我們再來對比RDB和AOF的優缺點。
2、RDB:Redis DataBase
在指定的時間間隔內將內存中的數據集快照寫入磁盤,實際操作過程是fork一個子進程,先將數據集寫入臨時文件,寫入成功后,再替換之前的文件,用二進制壓縮存儲。
優點:
整個Redis數據庫將只包含一個文件 dump.rdb,方便持久化
容災性好,方便備份
性能最大化,fork子進程來完成寫操作,讓主進程繼續處理命令,所以是IO最大化,使用單獨的子進程來進行持久化,主進程不會進行任何IO操作,保證了Redis的高性能
相對于數據集大時,比AOF的啟動效率更高
缺點:
數據安全性低。RDB 是間隔一段時間進行持久化,如果持久化之間redis 發生故障,會發生數據丟失,所以這種方式更適合用于數據要求不嚴謹的場景
由于RDB是通過fork子進程來協助完成數據持久化工作的,因此,如果當數據集較大時,可能會導致整個服務器停止服務幾百毫秒,甚至是1秒鐘
3、AOF:Append Only File
以日志的形式記錄服務器所處理的每一個寫、刪除操作,查詢操作不會記錄,以文本的方式記錄,可以打開文件看到詳細的操作記錄。
優點:
數據安全,Redis中提供了3種同步策略,即每秒同步、每修改同步和不同步。事實上,每秒同步也是異步完成的,其效率也是非常高的,所差的是一旦系統出現宕機現象,那么這一秒鐘之內修改的數據將會丟失,而每修改同步,我們可以將其視為同步持久化,即每次發生的數據變化都會被立即記錄到磁盤中
通過append模式寫文件,即使中途服務器宕機也不會破壞已經存在的內容,可以通過redis-check-aof工具解決數據一致性問題
AOF機制的rewrite模式。定期對AOF文件進行重寫,以達到壓縮的目的
缺點:
AOF 文件比 RDB 文件大,且恢復速度慢
數據集大的時候,比rdb 啟動效率低
運行效率沒有RDB高
AOF文件比RDB更新頻率高,優先使用AOF還原數據。
說到底,面試官是在考察你對Redis的持久化機制的掌握程度,只要你了解了RDB與AOF的作用與優缺點,如何組織語言應對面試就再容易不過了。
4、寫在最后
從架構演進的角度看,為了降低單個系統的復雜度,我們引入了分布式系統架構,這樣一來,單個系統的復雜度就轉移到了系統外部——各種中間件,Redis就是其中一個。
技術/業務復雜度不會憑空產生,也不會憑空消失,只會從一個地方轉移到另一個地方(就像物理學的能量守恒定律一樣),我們稱之為復雜度轉移。
有道無術,術可成;有術無道,止于術
歡迎大家關注Java之道公眾號
好文章,我在看??
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的面试官:能说说Redis的持久化机制吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 92年清华本科,做了30年技术,43岁在
- 下一篇: 致力推广 Vim 的那个程序员走了,Vi