redis持久化存儲

一.持久化是什麼

從redis角度來說,redis是基於內存操作的,斷電後數據清空,而要想保存該部分數據就需要將之存在硬盤上,使之永久性保存就是持久化。

二.持久化保存的方式

1.RDB(Redis database,快照)

將當前數據狀態進行保存,快照形式,存儲數據結果,存儲格式簡單,關注點在數據

save指令

命令save,前臺保存RDB文件。

配置指令 

dbfilename dump.rdb  說明:設置本地數據庫文件名,默認值爲 dump.rdb 經驗:通常設置爲dump-端口號.rdb

dir  說明:設置存儲.rdb文件的路徑 經驗:通常設置成存儲空間較大的目錄中,目錄名稱data

rdbcompression yes  說明:設置存儲至本地數據庫時是否壓縮數據,默認爲 yes,採用 LZF 壓縮 經驗:通常默認爲開啓狀態,如果設置爲no,可以節省 CPU 運行時間,但會使存儲的文件變大(巨大)

rdbchecksum yes  說明:設置是否進行RDB文件格式校驗,該校驗過程在寫文件和讀文件過程均進行 經驗:通常默認爲開啓狀態,如果設置爲no,可以節約讀寫性過程約10%時間消耗,但是存儲一定的數據損壞風險 。

由於redis是單線程任務執行序列,所有在save時會阻塞當前redis服務器。

bgsave指令

命令bgsave,後臺保存RDB文件。

工作原理:執行bgsave指令-調用fork函數生成子進程-創建RDB文件-返回提示信息。

 bgsave命令是針對save阻塞問題做的優化

配置指令

同上save配置,不同的有 

stop-writes-on-bgsave-error yes  

說明:後臺存儲過程中如果出現錯誤現象,是否停止保存操作 

 save second changes指令

滿足限定時間(second )範圍內key的變化數量達到指定數量(changes)即進行持久化 

2.AOF(append only file,日誌)

以獨立日誌的方式記錄每次寫命令,重啓時再重新執行AOF文件中命令 達到恢復數據的目的。與RDB相比可以簡單描述爲改記錄數據爲記錄數據產生的過程 

AOF寫數據三種策略(appendfsync)

always(每次) 每次寫入操作均同步到AOF文件中,數據零誤差,性能較低

everysec(每秒) 每秒將緩衝區中的指令同步到AOF文件中,數據準確性較高,性能較高 在系統突然宕機的情況下丟失1秒內的數據

no(系統控制) 由操作系統控制每次同步到AOF文件的週期,整體過程不可控

AOF配置

 appendonly yes|no 是否開啓

 appendfsync always|everysec|no 以什麼策略執行

 appendfilename filename 持久化文件名

 dir 保存路徑

AOF重寫

AOF爲什麼重寫?

隨着命令不斷寫入AOF,文件會越來越大,爲了解決這個問題,Redis引入了AOF重寫機制壓縮文件體積。AOF文件重 寫是將Redis進程內的數據轉化爲寫命令同步到新AOF文件的過程。簡單說就是將對同一個數據的若干個條命令執行結 果轉化成最終結果數據對應的指令進行記錄。

AOF重寫作用

降低磁盤佔用量,提高磁盤利用率

提高持久化效率,降低持久化寫時間,提高IO性能

降低數據恢復用時,提高數據恢復效率 

AOF重寫規則 

進程內已超時的數據不再寫入文件 

忽略無效指令,重寫時使用進程內數據直接生成,這樣新的AOF文件只保留最終數據的寫入命令

對同一數據的多條寫命令合併爲一條命令 

重寫指令

手動執行

bgrewriteaof

自動執行 

auto-aof-rewrite-min-size size 比對大小
auto-aof-rewrite-percentage percentage 比對百分比

3.RDB與AOF的區別

建議選擇:

1.對數據非常敏感,建議使用默認的AOF持久化方案 。

2.數據呈現階段有效性,建議使用RDB持久化方案 。

3.災難恢復選用RDB持久化方案。

4. 雙保險策略,同時開啓 RDB 和 AOF,重啓後,Redis優先使用 AOF 來恢復數據,降低丟失數據的量 。

總的來說還是看數據是否重要。

 

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