一.持久化是什麼
從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 來恢復數據,降低丟失數據的量 。
總的來說還是看數據是否重要。