Redis持久化存儲(RDB和AOF)

參考了: https://blog.csdn.net/canot/article/details/52886923  和 https://www.cnblogs.com/zhangchao-letv/articles/6122921.html 兩篇文檔html

在看redis的事務處理的ACID屬性,其中的一致性中提到了當Redis進程被終止:redis

若是Redis服務器進程在執行事務的過程當中被其餘進程終結,或者被管理員強制殺死,那麼根據Redis所使用的持久化模式,可能出現如下狀況:數據庫

  • 內存模式:若是Redis沒有采起持久化機制,那麼重啓以後的數據庫老是空白的,因此數據老是一致的。
  • RDB模式:在執行事務時,Redis不會中斷事務去執行保存RDB的工做,只有在事務執行以後,保存RDB的工做纔有可能開始,因此當RDB模式下的Redis服務器進程在事務中途被殺死時,事務內執行的命令,無論成功了多少,都不會被保存到RDB文件裏。恢復數據庫須要使用如今的RDB文件,而這個RDB文件的數據保存的是最後一次的數據庫快照(snapshot),因此他的數據可能不是最新的,但只要RDB文件自己沒有由於其餘問題而出錯,那麼還原以後的數據庫就是一致的。
  • AOF模式:由於保存AOF文件的工做在後臺線程進行,因此即便是在事務執行的中途,保存AOF文件的工做也能夠繼續進行,所以,根據事務語句是否被寫入並保存到AOF文件,會有如下兩種狀況:
    1. 若是事務語句未寫入到AOF文件,或者AOF未被SYNC調用保存到磁盤,那麼當進程被殺死以後,Redis能夠根據最近一次成功保存到磁盤的AOF文件來還原數據庫,只要AOF文件自己沒有由於其餘問題而出錯,那麼還原後的數據庫老是一致的,但其中的數據不必定是最新的。
    2. 若是事務的部分被寫入的AOF文件,而且AOF文件被成功保存,那麼不完整的事務執行信息就會遺留在AOF文件裏面,當重啓Redis時,程序會檢測到AOF文件並不完整,Redis會退出,並報告錯誤。須要使用Redis-check-aof工具將部分紅功的事務命令移除以後,才能再次啓動服務器。還原以後的數據老是一致的,並且數據也是最新的(知道事務執行以前爲止)

RDB持久化既能夠手動執行,也能夠根據服務器配置選項按期執行,該功能能夠將某個時間點上的數據庫狀態保存到一個RDB文件中。
RDB 持久化功能所生成的RDB 文件是一個通過壓縮的二進制文件,經過該文件能夠還原生成RDB 文件時的數據庫狀態。數組

由於生成的RDB文件是保存在硬盤中的,因此當Redis進程退出,或者是Redis停機,但只要RDB文件存在,那麼數據均可以還原狀態。服務器

Redis的RDB存儲的優缺:工具

  • 優勢:使用單獨子進程來進行持久化,主進程不會進行任何IO操做,保證了redis的高性能 
  • 缺點:RDB是間隔一段時間進行持久化,若是持久化之間redis發生故障,會發生數據丟失。因此這種方式更適合數據要求不嚴謹的時候

這裏說的這個執行數據寫入到臨時文件的時間點是能夠經過配置來本身肯定的,經過配置redis在n秒內若是超過m個key被修改這執行一次RDB操做。這個操做就相似於在這個時間點來保存一次Redis的全部數據,一次快照數據。全部這個持久化方法也一般叫作snapshots。性能

配置文件在相應的redis.conf裏spa

save 900 1    #在900s內超過1個key被修改
save 300 10   #在300s內超過10個key被修改
save 60 10000 #在60s內超過10000個key被修改 

snapshot出觸發的時機,是有「間隔時間」和「變動次數」共同決定的,同時符合兩個條件才能出發snapshot,不然「變動次數」會被繼續累加到下一個的時間間隔上,snapshot過程當中並不阻塞客戶端請求。snapshot首先將數據寫入臨時文件,當成功結束後,將臨時文件重名爲dump.rdb。.net

RDB變動計數器:線程

除了saveparams數組以外,服務器狀態還維持着一個dirty計數器,以及一個lastsave屬性:

dirty計數器記錄距離上一次成功執行SAVE命令或者BGSAVE命令以後,服務器對數據庫狀態(服務器中的全部數據庫)進行了多少次修改(包括寫入、刪除、更新等操做)。
lastsave屬性是一個UNIX時間戳,記錄了服務器上一次成功執行SAVE命令或者BGSAVE命令的時間。

當服務器成功執行一個數據庫修改命令以後,程序就會對dirty計數器進行更新:命令修改了多少次數據庫.dirty計數器的值就增長多少。
例如,若是咱們爲一個字符串鍵設置值:

redis>SET message "hello"
OK

那麼程序會將dirty計數器的值增長1。
又例如,若是咱們向一個集合鍵增長三個新元素:

redis>SADD database Redis MongoDB MariaDB
(integer) 3
相關文章
相關標籤/搜索