天天看點

redis 面試知識點總結1 redis持久化機制2 總結

1 redis持久化機制

由于redis基于記憶體運作,如果斷電關閉,記憶體中的資料就不再存在,資料丢失。但是redis支援關機再啟動資料依然存在,這就是redis持久化。實則是在某一時刻把redis中的資料寫入了磁盤中的持久化檔案中。

兩種持久化方式

1.1 RDB

RDB是Redis用來進行持久化的一種方式(預設開啟的是RDB持久化),是把目前記憶體中的資料集快照寫入磁盤(資料庫中所有鍵值對資料),恢複時是将快照檔案直接讀到記憶體裡。

原理是:redis建立一個與目前程序資料(變量、環境變量、計數器)完全相同的子程序實作持久化,主程序沒有IO操作,保證高性能。子程序将資料寫到臨時檔案中,持久化後,使用臨時檔案代替之前被持久化好的的檔案。

由于redis是單線程的,無法接收來自客服端的大量set請求。fork出新的程序既保證實作持久化,又實作了為向redis發送資料的請求提供響應。

啟動redis後,在redis目錄下可以看到: 這個dump檔案(記憶體資料的備份)就是rdb持久化生成的臨時檔案。

其中可以vim

redis.congf

這個配置檔案,查找dir會發現 dir ./ 也就是 dump.rdb會生成到 dir後面的路徑。

而且還要保證redis啟動時的路徑中包含dump.rdb檔案,這如果存在就會加載這個dump,否則就是empty list。

同樣可以在redis.conf中,查找dbfilename,修改後面的預設檔案名,以使用自定義的dump.rdb檔案。

redis 面試知識點總結1 redis持久化機制2 總結

下面這個圖就是持久化開始和結束的時候,對上面的驗證,其中可以看到fork出的新程序以及産生的temp檔案。

并且在持久化之後,發現dump5000000.rdb檔案的時間不一樣了,也就是确實使用臨時的rdb檔案進行了更新。

redis 面試知識點總結1 redis持久化機制2 總結

1.1.1 單線程阻塞

RDB持久化指令bgsave和save,save指令使用的是主程序進行持久化。

save指令阻塞:主程序會先去持久化操作,然後再接收用戶端的資料。這樣如果大量的set指令,性能 非常低。

1.1.2 觸發RDB持久化機制

  • shutdown時,如果沒有開啟aof,就會fork子程序,觸發持久化。(kill不會觸發,或者是意外當機也不會觸發)
  • 配置檔案中包含了預設觸發RDB持久化的機制,redis.conf 注釋檔案截圖:(關鍵字:save,redis調優就是調整save後面的參數)
    redis 面試知識點總結1 redis持久化機制2 總結
  • 執行指令 save或者是bgsave,bgsave是fork出子程序持久化,而save是隻會儲存,其他都阻塞。
  • 響應用戶端的請求,執行flushall指令。

1.1.3 RDB持久化關閉

将這三行都注釋掉或者使用 save " "。

但是redis有主從叢集(複制),使用了主從叢集模式無法關閉RDB持久化,因為主機把rdb持久化檔案發送給從機,從機會複制主機的資料。

redis 面試知識點總結1 redis持久化機制2 總結

1.2 aof

aof對比RDB的優勢在于:

  • aof比RDB持久化保證資料丢失更少。

    由于RDB的機制,如果某一個資料的傳入後,服務端意外當機,那麼這個沒有觸發持久化機制的資料就會丢失。根據RDB的快照配置,當機會丢失一段時間的資料。而aof就可以解決這個問題。

    aof丢失資料的最高門檻值是2s,也就是2s内的資料都可以保證不會丢失。因為aof預設配置是每1s執行一次備份。

aof持久化儲存的是指令,這些指令的儲存不同于RDB儲存的記憶體資料,這些指令字元串儲存在

append.aof

檔案中。

redis 面試知識點總結1 redis持久化機制2 總結

1.2.1 aof儲存的是協定

如圖,打開rof持久化,并且添加資料。

redis 面試知識點總結1 redis持久化機制2 總結

這樣會多出一個appendonly.rof檔案,我們打開這個檔案看看内部存儲的是什麼内容。

redis 面試知識點總結1 redis持久化機制2 總結

會發現這個rof檔案中記錄了以下内容:

redis 面試知識點總結1 redis持久化機制2 總結

儲存的内容就是redis協定,其中select下面的0,代表了預設儲存到redis16個庫中的預設0号庫,*2代表下面有兩條指令,分别是select 0 和 set k1 v1,$6代表了select的長度是6,下面的$同理。

1.2.2 觸發機制(配置檔案)

  • no:本作業系統調用,等作業系統進行資料緩存,同步到磁盤。優點是快。
  • always:同步持久化,每次發生資料變更,都會立即記錄到磁盤中。優點是安全,但是慢,性能差。
  • everysec:每一秒同步一次。預設值,很快。

1.2.3 aof重寫

當aof檔案中當資料增長到一定數量(比如一個set k1 v1,之後删除 del k1,這兩個指令沒有必要記錄到aof檔案中,包括多個對相同key的incr指令,同樣可以通過重寫,直接set,實作瘦身),redis調用bgrewriterof對日志檔案進行重寫,就是給append檔案瘦身。

當aof檔案大小大于配置項時,開啟自動重寫。

auto-aof-rewrite-min-size 64MB

當aof檔案大小的增長率大于配置項時,開啟自動重寫。(指超過原aof檔案的100%)

auto-aof-rewrite-percentage 100

1.2.4 aof混合持久化

開啟混合持久化

redis4.0版本的混合持久化預設是關閉的,通過

aof-use-rdb-preamble

配置參數控制,yes為開啟,no為關閉。

混合持久化是通過bgrewriteaof完成的,不同的是當開啟混合持久化,fork出的子程序會先将共享的記憶體副本全量的以RDB格式寫入aof檔案中,然後再将重寫緩沖區的增量指令以AOF方式寫入aof檔案中,寫入完成後通知主程序更新統計資訊,并将新的含有RDB格式和AOF格式的aof檔案替換舊的aif檔案。(新的aof檔案前半段是RDB格式的全量資料,後半段是AOF格式的增量資料)

優點:混合持久化結合了RDB和aof的優點,加載速度快,結合AOF保證增量的資料以AOF方式儲存,減少資料丢失。

缺點:相容性差,開啟了混合持久化,4.0版本之前不識别aof檔案,并且RDB格式閱讀性差。

2 總結

  • redis有RDB持久化,AOF的出現優化了資料丢失的問題,RDB可能會丢失最後一次快照後的資料,而AOF丢失不會超過2s的資料。
  • 如果RDB和AOF同時開啟,優先使用AOF機制。
  • RDB性能消耗低,資料丢失會超過AOF,速度快,适合大規模的資料恢複,資料完整性和一緻性低。

繼續閱讀