目錄linux
redis是一個基於內存的數據庫,故在redis正在運行的數據都在內存中,而內存掉電,內存上因此數據都會消失。故把redis當成數據庫使用時就須要對redis進行持久化。redis
在說redis持久化的時候,咱們先來聊聊其餘的知識。linux的父子進程。在Linux中使用fork()函數會給當前正在運行的進程建立一個子進程。那麼如今問題就來了,fork時父子進程中的數據有什麼關係呢?通常說到進程咱們都會知道進程間彼此是數據隔離的。然而實際上,子進程在剛建立時,能夠看到子進程中的數據。而在修改該數據時,卻不會對父進程形成影響。一樣子進程也不會受到父進程修改數據的影響。而形成這種現象的,正是由於linux的copy on write機制。數據庫
copy on write:是一種內核機制,通俗來說就是寫時複製。及建立子進程並不發生複製,建立子進程後父子進程共用數據。只有在修改數據是纔會建立新的空間。緩存
這樣作的好處是建立進程變快了。並且根據開發經驗,咱們建立子進程後不可能父子進程把全部數據都改一遍。而這套機制就是指針支撐的。玩的是指針安全
redis中有兩種數據到存儲方式,rdb和aof。下面咱們來着重講一下這兩種持久化方式:服務器
RDB持久化方式可以在指定的時間間隔能對你的數據進行快照存儲.app
redis的rdb持久化方式有存儲的是時點數據即某一個時間點的數據。由於若是存儲實時更新的數據的話,若是一直有數據寫入會致使,持久化過程一直進行,下降了redis的快捷的特性。所以redis有兩種持久化數據的方式函數
以上兩個命令直接能夠在redis的客戶端運行。工具
注意若是使用配置文件的方式配置數據持久化,配置文件中給出bgsave的規則: save這個標識。配置的規則:(要修改的文件是dbfilename dump.rdb,文件通常存儲在var/lib/redis/6379)性能
save 900 1 save 300 10 save 60 10000
該規則意味着,在每60秒檢測一次redis的數據量,若是達到10000就進行持久化,不然不持久化。在每300秒檢測一次redis的數據量,若是達到10就進行持久化,不然不持久化。在每900秒檢測一次redis的數據量,若是達到1就進行持久化,不然不持久化。
與AOF相比,在恢復大的數據集的時候,RDB方式會更快一些.
丟失數據相對多一些時點與時點之間窗口數據容易丟失。8點獲得一個rdb,9點剛要寫一個rdb,掛機了。那麼8~9之間的數據就會丟失。
AOF實際是把對redis操做的操做記錄,經過日誌的方式記錄下來,這樣想要恢復數據庫文件,只須要把因此指令執行一遍就行。
須要開啓aof只須要把dump修改appendonly該爲yes便可。
appendonly yes
AOF 文件有序地保存了對數據庫執行的全部寫入操做, 這些寫入操做以 Redis 協議的格式保存, 所以 AOF 文件的內容很是容易被人讀懂, 對文件進行分析(parse)也很輕鬆。 導出(export) AOF 文件也很是簡單: 舉個例子, 若是你不當心執行了 FLUSHALL 命令, 但只要 AOF 文件未被重寫, 那麼只要中止服務器, 移除 AOF 文件末尾的 FLUSHALL 命令, 並重啓 Redis , 就能夠將數據集恢復到 FLUSHALL 執行以前的狀態
弊端,體量無線變大, 恢復慢
爲解決aof的弊端日誌,優勢若是能保住,仍是能夠用的。就有一個方案:設計一個方案讓日誌,AOF足夠小
就是hdfs,fsimage+edits.log 。讓日誌只記錄增量,合併操做的中間過程。
而4.0版本也是這項技術的分界點
從這點能夠看出,aof和rdb是能夠共存的。
Redis 支持一種有趣的特性: 能夠在不打斷服務客戶端的狀況下, 對 AOF 文件進行重建(rebuild)。執行 BGREWRITEAOF 命令, Redis 將生成一個新的 AOF 文件, 這個文件包含重建當前數據集所需的最少命令。Redis 2.2 須要本身手動執行 BGREWRITEAOF 命令; Redis 2.4 則能夠自動觸發 AOF 重寫, 具體信息請查看 2.4 的示例配置文件。
AOF 重寫和 RDB 建立快照同樣,都巧妙地利用了寫時複製機制:
搞定!如今 Redis 原子地用新文件替換舊文件,以後全部命令都會直接追加到新 AOF 文件的末尾。
redis的持久化想要開啓其實挺簡單的只須要,修改conf配置文件的幾個配置項便可。
當兩者混合使用時,若是redis服務器中止後從新運行,那麼redis恢復數據只會從aof中同步,而不會去向rdb同步。並且在主從複製時,rdb會記錄上一次鏈接的端口,而aof不會。因此主從複製時,若是沒有開啓aof,那麼從服務器在斷開主服務器後從新鏈接主服務器,只會同步從服務器斷開時的增量數據,而開啓aof後從服務器須要同步主服務器中的全部內容。