前言簡介
Redis是一種高級key-value資料庫,它跟memcached類似,不過資料可以持久化,而且支持的資料型別很豐富,有字串,鏈表,集 合和有序集合,支持在服務器端計算集合的并,交和補集(difference)等,還支持多種排序功能,所以Redis也可以被看成是一個資料結構服務器,
Redis的所有資料都是保存在記憶體中,然后不定期的通過異步方式保存到磁盤上(這稱為“半持久化模式”);也可以把每一次資料變化都寫入到一個append only file(aof)里面(這稱為“全持久化模式”),
Redis是記憶體資料庫,Redis的資料都存放在記憶體中,如果不將記憶體中的資料庫狀態保存到磁盤,那么一旦服務器行程退出,服務器中的資料庫狀態也會消失,所有redis提供了持久化功能,由于如果沒有配置持久化,redis重啟后資料就全丟失了,于是需要開啟redis的持久化功能,將資料保存到磁盤上,當redis重啟后,可以從磁盤中恢復資料,redis提供兩種方式進行持久化,一種是RDB持久化(原理是將Reids在記憶體中的資料庫記錄定時dump到磁盤上的RDB持久化),另外一種是AOF(append only file)持久化(原理是將Reids的操作日志以追加的方式寫入檔案),
RDB持久化(Redis DataBase)
一、RDB持久化配置
save 900 1 # 在900秒(15分鐘)之后,如果至少有1個key發生變化,則dump記憶體快照, save 300 10 # 在300秒(5分鐘)之后,如果至少有10個key發生變化,則dump記憶體快照, save 60 10000 # 在60秒(1分鐘)之后,如果至少有10000個key發生變化,則dump記憶體快照,設定save "",就關閉持久化了, stop-writes-on-bgsave-error yes # 持久化如果出錯,是否還需要redis繼續作業,值為yes:繼續作業,一般設定為yes, rdbcompression yes # 是否壓縮rdb檔案,需要消耗一些cpu資源, rdbchecksum yes # 保存rdb檔案的時候,進行錯誤的檢查校驗, dbfilename dump.rdb # rdb檔案的檔案名, dir /www/server/redis/ # rdb檔案保存的目錄,則全路徑為:/www/server/redis/dump.rdb,
二、如何生成rdb檔案:RDB持久化觸發機制,觸發之后就備份自動生成一個rdb檔案
1.save的規則滿足的情況下,會自動觸發rdb規則,
2.執行了flushall命令,也會觸發我們的rdb規則,不知道flushdb行不行,自己測驗的時候有時可以,有時又不行,
3.關掉redis服務,也會產生rdb檔案,
三、如何恢復rdb檔案
1、查看dump.rdb檔案需要存放的位置,即redis啟動目錄,如果檔案不在這個目錄下,就不會自動恢復,
127.0.0.1:6379> config get dir 1) "dir" 2) "/www/server/redis" # 如果在這個目錄下存在dump.rdb檔案,啟動時就會自動恢復其中的資料,
2、只需要將rdb檔案放在我們redis啟動目錄下就可以,redis啟動的時候會自動檢查dump.rdb檔案,并恢復其中的資料,
四、RDB持久化優點
1. 適合大規模的資料恢復,
2. 對資料的完整性要求不高,
五、RDB持久化缺點
1. 需要一定的時間間隔進行操作,如果redis意外宕機了,最后一次修改資料就沒有了,
六、RDB持久化介紹
在指定的時間間隔內將記憶體中的資料集快照寫入磁盤,它恢復時是將快照檔案直接讀到記憶體里,
AOF持久化(Append Only File)
一、AOF持久化配置
appendonly no # 默認是不開啟aof持久化的,如果設定值為yes,就開啟了aof持久化, appendfilename "appendonly.aof" # aof持久化的檔案名, appendfsync no # 從不同步,高效但是資料不會被持久化, appendfsync always # 每次有資料修改發生時都會寫入AOF檔案, appendfsync everysec # 每秒鐘執行一次同步,該策略為AOF的預設策略,可能會丟失這1秒的資料,
二、AOF持久化應用
1. 修改配置之后,需要重啟一下redis服務,這時候就會生成appendonly.aof檔案,檔案內容可查看,不過這時候內容為空,
[root@localhost ~]# service redis restart
2. 開始向redis資料庫中添加資料,然后關閉redis服務,
127.0.0.1:6379> set age 27 127.0.0.1:6379> set name jose 127.0.0.1:6379> keys * # 查看所有的鍵 127.0.0.1:6379> shutdown # 關閉redis服務
3. 啟動redis服務,這時候可查看appendonly.aof檔案內容,
[root@localhost ~]# vim appendonly.aof # 查看是否有添加記錄 [root@localhost ~]# service redis restart # 重啟redis服務
4. 連接redis服務,查看資料,
[root@cute ~]# redis-cli 127.0.0.1:6379> auth 123456 127.0.0.1:6379> keys * 127.0.0.1:6379> get age # 27 127.0.0.1:6379> get name # jose
三、AOF持久化優點
1. 該機制可以帶來更高的資料安全性,即資料持久性,Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步,事實上,每秒同步也是異步完成的,其效率也是非常高的,所差的是一旦系統出現宕機現象,那么這一秒鐘之內修改的資料將會丟失,而每修改同步,我們可以將其視為同步持久化,即每次發生的資料變化都會被立即記錄到磁盤中,可以預見,這種方式在效率上是最低的,至于不同步,效率是最高的,
2. 由于該機制對日志檔案的寫入操作采用的是append模式,因此在寫入程序中即使出現宕機現象,也不會破壞日志檔案中已經存在的內容,然而如果我們本次操作只是寫入了一半資料就出現了系統崩潰問題,不用擔心,在Redis下一次啟動之前,我們可以通過redis-check-aof工具來幫助我們解決資料一致性的問題,
3. 如果日志過大,Redis可以自動啟用rewrite機制,即Redis以append模式不斷的將修改資料寫入到老的磁盤檔案中,同時Redis還會創建一個新的檔案用于記錄此期間有哪些修改命令被執行,因此在進行rewrite切換時可以更好的保證資料安全性,
4. AOF包含一個格式清晰、易于理解的日志檔案用于記錄所有的修改操作,事實上,我們也可以通過該檔案完成資料的重建,
四、AOF持久化缺點
1. 對于相同數量的資料集而言,AOF檔案通常要大于RDB檔案,AOF 在恢復大資料集時的速度比 RDB 的恢復速度要慢,
2. 根據同步策略的不同,AOF在運行效率上往往會慢于RDB,總之,每秒同步策略的效率是比較高的,同步禁用策略的效率和RDB一樣高效,所以我們redis默認的配置就是rdb持久化,
五、AOF檔案重寫規則
因為 AOF 的運作方式是不斷地將命令追加到檔案的末尾, 所以隨著寫入命令的不斷增加, AOF 檔案的體積也會變得越來越大,舉個例子, 如果你對一個計數器呼叫了 100 次 INCR , 那么僅僅是為了保存這個計數器的當前值, AOF 檔案就需要使用 100 條記錄(entry),然而在實際上, 只使用一條 SET 命令已經足以保存計數器的當前值了, 其余 99 條記錄實際上都是多余的,為了處理這種情況, Redis 支持一種有趣的特性: 可以在不打斷服務客戶端的情況下, 對 AOF 檔案進行重建(rebuild),執行 BGREWRITEAOF 命令, Redis 將生成一個新的 AOF 檔案, 這個檔案包含重建當前資料集所需的最少命令,
六、AOF檔案出錯了,怎么辦?
服務器可能在程式正在對 AOF 檔案進行寫入時停機, 如果停機造成了 AOF 檔案出錯(corrupt), 那么 Redis 在重啟時會拒絕載入這個 AOF 檔案, 從而確保資料的一致性不會被破壞,我們需要修復這個aof檔案,redis給我們提供了一個工具:redis_check_aof --fix
[root@localhost ~]# redis_check_aof --fix appendonly.aof
RDB 和 AOF 持久化的區別
差別一:
rdb保存的檔案是dump.rdb檔案,
aof保存的檔案是appendonly.aof檔案,
差別二:
RDB持久化是指在指定的時間間隔內將記憶體中的資料集快照寫入磁盤,實際操作程序是fork一個子行程,先將資料集寫入臨時檔案,寫入成功后,再替換之前的檔案,用二進制壓縮存盤,save, shutdown, slave 命令會觸發這個持久化操作,粒度較大,如果在save, shutdown, slave 之前crash了,即上一次持久化之后到這一次還未持久化中間的這個時間段crash了,則中間這個時間段的操作沒辦法恢復,
AOF持久化以日志的形式記錄服務器所處理的每一個寫、洗掉操作,查詢操作不會記錄,以文本的方式記錄,可以打開檔案看到詳細的操作記錄,持續的用日志記錄寫操作,crash后利用日志恢復,粒度較小,crash之后,只有crash之前沒有來得及做日志記錄的操作沒辦法恢復,
https://www.cnblogs.com/shizhengwen/p/9283973.html
https://blog.csdn.net/w2393040183/article/details/76167856
https://www.redis.net.cn/tutorial/3519.html
https://blog.csdn.net/xhqiang/article/details/84958679
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/29501.html
標籤:NoSQL
上一篇:學習之Redis(一)
