前面咱們講了 Redis 的數據結構(Redis那些事之數據結構),今天咱們來看看 Redis 的持久化,Redis 的持久化分兩種 RDB 和 AOF。這兩種各有優缺點,咱們先看下官方是怎麼描述這兩種結構的:html
RDB持久性以指定的時間間隔執行數據集的時間點快照。
AOF持久性記錄服務器接收的每一個寫入操做,將在服務器啓動時再次播放,重建原始數據集。 使用與Redis協議自己相同的格式以僅追加方式記錄命令。 當Redis太大時,Redis可以重寫日誌背景。redis
咱們能夠選擇關閉持久化,把 Redis 做爲一個內存緩存使用,也能夠開啓持久化作數據庫使用,RDB 和 AOF 能夠同時開啓,同時開啓的狀況下 Redis 優先讀取 AOF 裏面的數據。最重要的是理解 RDB 和 AOF 的區別和各自的優缺點,以便咱們在不一樣的業務員場景下擇優選擇。數據庫
RDB 持久化能夠手動執行,也能夠根據配置選項按期執行,該功能能夠將某個時間點的數據庫狀態保存到一個 RDB 文件中。由於 RDB 是保存在硬盤中,因此即便 Redis 服務器進程掛掉,只要 RDB 文件存在,Redis 就能夠用它來還原數據狀態。
Redis 提供兩個手動執行命令 SAVE、BGSVE,SAVE命令執行時,客戶端發送的因此命令請求都會被阻塞。BGSAVE 命令是由主進程 fork 出一個子進程進行持久化。因此在持久化的過程當中 Redis 還能夠繼續執行客戶端的命令,持久化由子進程執行。由於 BGSAVE 命令是非阻塞的,因此自動執行所有采用的是 BGSAVE 命令。
RDB 文件保存了用戶的寫入和刪除命令,並根據不一樣的數據類型進行相應的編碼,一個標準的 RDB 文件通常有一下部分組成:緩存
其中 database 的格式爲:安全
其中 key_value_pairs 部分的 key 是採用的 SDS 編碼, value 是根據不一樣的數據類型進行存儲(參考:Redis那些事之數據結構)服務器
除了 RDB 持久化功能以外 Redis 還提供了 AOF(append only file)持久化功能,AOF 是經過保存 Redis服務器所執行的寫命令來記錄數據庫狀態的。
AOF 的實現能夠功能大致分爲 命令追加(append)、文件寫入、文件同步(sync)。
當 AOF 功能打開的時候,服務器在執行完一個寫命令後,會以寫一個是將被執行命令追加到服務器狀態的 aof_buf 緩衝區的末尾。Redis 服務器在一個事件循環(loop)週期裏它會調用一次 flushAppendOnlyFile 函數。考慮是否將 aof_buf 緩衝區中的內容寫入和保存到 AOF 文件裏面。
由於 AOF 是經過客戶端發送的寫命令來保證數據庫的狀態的,因此隨着時間的流失, AOF 文件中的內容可能會出現愈來愈多對一樣一個鍵的修改。文件的體積也愈來愈大,如不加以控制,可能會對 Redis 服務器形成影響,使用 AOF 恢復所需的時間也會加大。 Redis 爲此提供了 AOF 重寫功能, AOF 的重寫並非對現有文件進行分析而後進行重寫,而是遍歷讀取數據庫裏的數據,而後把對應的命令轉成寫入命令,寫入到一個新的文件。這個執行過程一樣是阻塞進行的,因此能夠繼續採用子進程來執行,等子進程處理完後對父進程發送一個信號通知從新執行完畢。而後父進程對原來的 AOF 文件原子性的覆蓋。(在子進程執行重寫的過程,父進程一樣會接收命令,這個期間主進程所接收到的命令都會保存到緩衝區,在執行覆蓋前,Redis服務會把緩衝區的命令追加到子進程發來的 AOF 文件裏面)。數據結構
RDB 的優勢app
AOF 的優勢函數
RDB 的缺點工具
AOF 的缺點