redis高級進階5----持久化

什麼叫持久化過程?
將內存中的數據保存到硬盤中。
Redis持久化的兩種方式:RDB與AOF。
RDB:將當前數據進行保存,形成快照。這種方式是存儲數據結果,存儲格式簡單,關注重點是數據。
AOF:將數據的操作過程進行保存,形成日誌。該方式是存儲操作過程,存儲格式複雜,關注重點是數據的操作過程。
##1.RDB方式
修改redis.conf配置文件中的如下部分
1>快照生成位置
dir /usr/java/redis/redis-5.0.5/data
2>快照生成名稱,一般是dump後加上端口號
dbfilename dump-6379.rdb
3>快照是否壓縮,默認值是 yes,LFZ算法進行壓縮
rdbcompression yes
4>快照存儲後,redis使用CRC64算法進行數據校驗,默認值yes
rdbchecksum yes
如下測試下數據恢復流程
1>redis採用save命令保存快照,會生成dump-6379.rdb文件
2>將該文件copy到另一臺redis服務器上,啓動redis服務器
3>啓動redis客戶端,在客戶端操作redis取數據命令,發現有值,說明數據已經備份了
RDB優點:
1>RDB是一個壓縮過的二進制文件,存儲效率高
2>RDB存儲的是某個時間點的數據快照,適合用於數據備份、全量複製等場景。
3>RDB恢復數據的速度比AOF快
RDB缺點:
1>RDB無法做到實時持久化,宕機時具有丟失數據的可能
2>RDB數據量大時I/O性能低下
##2.AOF方式
AOF(append only file)持久化,以日誌的方式記錄每次寫命令,重啓時重新執行AOF文件中的命令達到恢復數據的目的。
AOF寫數據具有三種策略
1>always(每次)
每次寫入操作均同步到AOF文件中,數據零誤差,性能低。
2>everysec(每秒),redis默認選用
每秒將緩衝區中的指令同步到AOF文件中,數據準確率較好,性能較高,在系統宕機的時候存在1s內的數據丟失的可能。
3>no(系統控制)
由操作系統控制每次同步到AOF文件的週期,整體過程不可控。
修改redis.conf配置文件中的如下部分

1>啓用aof模式
appendonly yes
默認aof文件名稱,默認寫數據策略。
AOF重寫
隨着redis寫入命令逐步增多,aof文件會越來越大。爲了解決這個問題,redis引入了重寫機制來壓縮文件。aof重寫機制:將同一個key的若干條命令執行的結果轉換成最終結果對應的指令進行記錄。舉例如下:
如果redis連續收到如下指令:
set zs
set li
set ww
incr num
incr num
incr num
正常來說,redis會記錄每條指令,那麼如上情況,redis得記錄6條指令到aof文件。我們仔細分析下,如上6條指令其實可以轉換成如下2條有效指令
set ww
incr num 3
redis的重寫機制就是將如上6條指令轉換成如上2條指令的過程。
AOF重寫機制的好處
1>降低磁盤佔用量,畢竟6條指令變成了2條,佔用存儲會小些。
2>提高磁盤I/O性能,6條指令要讀寫磁盤6次,2條指令只需2次。
3>提高持久化效率,寫2條指令比寫5條指令快。
AOF重寫方式
1>手動重寫,bgrewriteaof
2>自動重寫
auto-aof-rewrite-min-size 自動重寫size大小,默認64M
auto-aof-rewrite-percentage 文件增量百分比
2.1>自動重寫觸發參數比對
aof_current_size aof當前文件大小
aof_base_size aof基準文件大小
2.2>自動重寫觸發條件
情況1:aof_current_size > auto-aof-rewrite-min-size
假設當前aof文件爲80M,那麼就會觸發重寫條件,對aof文件進行重寫
情況2:(aof_current_size - aof_base_size)/aof_base_size >= auto-aof-rewrite-percentage
假設aof_current_size=80M,aof_base_size設置50M,那麼百分比值爲(80-50)/50=60%。假設auto-aof-rewrite-percentage爲15%,那麼這種情況已經觸發重寫機制了。
##3.RDB與AOF使用場景對比

RDB與AOF使用場景對比
1>對數據非常敏感,例如銀行轉賬,建議採用AOF作爲持久化方案
2>數據允許一定時間範圍內的誤差,例如某篇新聞的評論/點贊等,採用RDB方案

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