參考了: https://blog.csdn.net/canot/article/details/52886923 和 https://www.cnblogs.com/zhangchao-letv/articles/6122921.html 兩篇文檔html
在看redis的事務處理的ACID屬性,其中的一致性中提到了當Redis進程被終止:redis
若是Redis服務器進程在執行事務的過程當中被其餘進程終結,或者被管理員強制殺死,那麼根據Redis所使用的持久化模式,可能出現如下狀況:數據庫
RDB持久化既能夠手動執行,也能夠根據服務器配置選項按期執行,該功能能夠將某個時間點上的數據庫狀態保存到一個RDB文件中。
RDB 持久化功能所生成的RDB 文件是一個通過壓縮的二進制文件,經過該文件能夠還原生成RDB 文件時的數據庫狀態。數組
由於生成的RDB文件是保存在硬盤中的,因此當Redis進程退出,或者是Redis停機,但只要RDB文件存在,那麼數據均可以還原狀態。服務器
Redis的RDB存儲的優缺:工具
這裏說的這個執行數據寫入到臨時文件的時間點是能夠經過配置來本身肯定的,經過配置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