對于Redis來說是存儲在緩存之中的,是以緩存資料丢失問題一直是程式員們相當關注的話題,
是以對緩存中的資料定時進行持久化的必要性就相當突出了,Redis持久化分别有RDB和AOF兩種方式,
以下是這兩種方式的相關配置:
1 第一種: RDB持久化方式
1.1 概述
預設redis是會以快照的形式将資料持久化到磁盤的(一個二進制檔案,dump.rdb,這個檔案名字可以指定),在配置檔案中的格式是:save N M表示在N秒之内,redis至少發生M次修改則redis抓快照到磁盤。當然我們也可以手動執行save或者bgsave(異步)做快照。
1.2 實作機制
當redis需要做持久化時,redis會fork一個子程序;子程序将資料寫到磁盤上一個臨時RDB檔案中;當子程序完成寫臨時檔案後,将原來的RDB替換掉,這樣的好處就是可以copy-on-write
1.3 相關配置
redis.conf配置檔案:
1) 持久化政策:
# save ""
save 900 1
save 300 10
save 60 10000
2) 檔案名稱:
# The filename where to dump the DB
dbfilename dump.rdb
3) 檔案存放目錄:
# Note that you must specify a directoryhere, not a file name.
dir ./
2 第二種:AOF持久化方式
2.1概述
還有一種持久化方法是Append-only:filesnapshotting方法在redis異常死掉時,最近的資料會丢失(丢失資料的多少視你save政策的配置),是以這是它最大的缺點,當業務量很大時,丢失的資料是很多的。Append-only方法可以做到全部資料不丢失,但redis的性能就要差些。AOF就可以做到全程持久化,隻需要在配置檔案中開啟(預設是no),appendonly yes開啟AOF之後,redis每執行一個修改資料的指令,都會把它添加到aof檔案中,當redis重新開機時,将會讀取AOF檔案進行“重放”以恢複到redis關閉前的最後時刻。
LOG Rewriting随着修改資料的執行AOF檔案會越來越大,其中很多内容記錄某一個key的變化情況。是以redis有了一種比較有意思的特性:在背景重建AOF檔案,而不會影響client端操作。在任何時候執行BGREWRITEAOF指令,都會把目前記憶體中最短序列的指令寫到磁盤,這些指令可以完全建構目前的資料情況,而不會存在多餘的變化情況(比如狀态變化,計數器變化等),縮小的AOF檔案的大小。是以當使用AOF時,redis推薦同時使用BGREWRITEAOF。
AOF檔案重新整理的方式,有三種,參考配置參數appendfsync :appendfsync always每送出一個修改指令都調用fsync重新整理到AOF檔案,非常非常慢,但也非常安全;appendfsynceverysec每秒鐘都調用fsync重新整理到AOF檔案,很快,但可能會丢失一秒以内的資料;appendfsync no依靠OS進行重新整理,redis不主動重新整理AOF,這樣最快,但安全性就差。預設并推薦每秒重新整理,這樣在速度和安全上都做到了兼顧。
可能由于系統原因導緻了AOF損壞,redis無法再加載這個AOF,可以按照下面步驟來修複:首先做一個AOF檔案的備份,複制到其他地方;修複原始AOF檔案,執行:$ redis-check-aof –fix ;可以通過diff –u指令來檢視修複前後檔案不一緻的地方;重新開機redis服務。
2.2 實作機制
1)Redis将資料庫做個快照,周遊所有資料庫,将資料庫中的資料還原為跟用戶端發送來的指令的協定格式的字元串,
2)然後Redis建立一個臨時檔案将這些快照資料儲存,待快照程式結束後将臨時檔案名修改為正常的aof檔案名,原有的檔案則自動丢棄。
由于在快照進行的過程中可能存在新增的指令修改了資料庫中的資料,則在快照程式結束後需要将新修改的資料追加到aof檔案中,後續的從用戶端過來的指令都會不斷根據不同的安全級别寫到磁盤裡面去。這樣就支援了實時的持久化,隻是可能會有短時間内的資料丢失,對一般系統還是可以容忍的。
2.3 相關配置
redis 127.0.0.1:6380> config get*append*
1) "appendonly"
2) "yes"
3) "no-appendfsync-on-rewrite"
4) "no"
5) "appendfsync"
6) "everysec"
redis 127.0.0.1:6380> config get*aof*
1) "auto-aof-rewrite-percentage"
2) "100"
3) "auto-aof-rewrite-min-size"
4) "67108864"