Redis學習之數據持久化與數據恢復

redis緩存是支持數據持久化的操作,也就是可以把內存中的數據持久化到硬盤當中,和數據庫有些相似,這也是redis和memcache的區別之一。

redis數據持久化常用的方式有兩種:

(1)Snapshotting (RDB)

在指定的時間間隔內生成數據集的時間點快照(point-in-time snapshot),也是redis持久化的默認方式。

(2)Append Only File (AOF)

持久化記錄服務器執行的所有操作命令,並在服務啓動時,通過重新執行這些命令來還原數據集。


RDB的生成方式:

(1)通過執行命令手動生成

可通過SAVE和BGSAVE命令對數據進行持久化,生成RDB文件。

SAVE命令,會阻塞當前服務的進程,在阻塞期間,服務器不能處理任何命令請求,直到緩存數據持久化完成。

BGSAVE命令,顧名思義就是在後臺執行,不會阻塞當前服務,會派生出 一個子進程,由子進程負責持久化數據,父進程繼續處理命令請求。

(2)通過配置自動生成

可以通過redis.conf配置文件找到SNAPSHOTTING配置,修改save選項,讓服務器每隔一段時間自動執行BGSAVE。

配置如下:

<span style="font-size:12px;">################################ SNAPSHOTTING  #################################
#
# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
#
#   Note: you can disable saving at all commenting all the "save" lines.

save 900 1         //服務器在900秒內,對緩存數據庫至少修改了1次
save 300 10        //服務器在300秒內,對緩存數據庫至少修改了1次
save 60 10000      //服務在60秒內,對緩存數據庫至少修改了10000次

# Compress string objects using LZF when dump .rdb databases?
# For default that's set to 'yes' as it's almost always a win.
# If you want to save some CPU in the saving child set it to 'no' but
# the dataset will likely be bigger if you have compressible values or keys.
rdbcompression yes

# The filename where to dump the DB
dbfilename dump.rdb    //持久化數據存到磁盤的文件名稱

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
# 
# Also the Append Only File will be created inside this directory.
# 
# Note that you must specify a directory here, not a file name.
dir ./       //存到磁盤的路徑</span>

只要滿足上面三個save配置中的一個,redis就會自動進行數據快照,持久化到硬盤中。用戶可根據自己需求進行配置。

看到上面的配置我會很好奇,服務器怎麼知道我在多長的時間對緩存數據修改了多少次了?後來發現Redis服務其中有個dirty和一個lastsave時間戳。

當服務器執行一個數據修改命令之後,dirty計數器數值會進行更新。

lastsave則是記錄上次服務器執行BGSAVE命令的時間,在這就不詳細解釋了。


AOF

AOF持久化數據是通過保存Redis服務所有的操作命令,下次啓動服務時,從新執行這些操作命令來還原緩存數據。

AOF文件刷新有三種方式:

(1)appendfsync always - 每提交一個修改命令都調用fsync刷新到AOF文件,非常非常慢,但也非常安全
(2)appendfsync everysec - 每秒鐘都調用fsync刷新到AOF文件,很快,但可能會丟失一秒以內的數據
(3)appendfsync no - 依靠OS進行刷新,redis不主動刷新AOF,這樣最快,但安全性就差

默認並推薦每秒刷新,這樣在速度和安全上都做到了兼顧

數據恢復:

RDB

RDB恢復數據的方式沒有專門的操作命令去執行,redis服務啓動時,會自動查找RDB文件進行加載,指導RDB文件加載完成爲止。

AOF

服務器在啓動時,通過載入和執行AOF文件中保存的命令來還原服務器關閉之前的數據庫狀態,具體過程:

(1)載入AOF文件

(2)創建模擬客戶端

(3)從AOF文件中讀取一條命令

(4)使用模擬客戶端執行命令

(5)循環讀取並執行命令,直到全部完成

如果同時啓用了RDB和AOF方式,AOF優先,啓動時只加載AOF文件恢復數據


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章