Redis总结(四)Redis 的持久化
前面已經(jīng)總結(jié)了Redis 的安裝和使用今天講下Redis 的持久化。
redis跟memcached類似,都是內(nèi)存數(shù)據(jù)庫,不過redis支持?jǐn)?shù)據(jù)持久化,也就是說redis可以將內(nèi)存中的數(shù)據(jù)同步到磁盤來持久化,以確保redis 的數(shù)據(jù)安全。
?
?redis持久化的兩種方式
redis提供了兩種持久化的方式,分別是RDB(Redis DataBase)和AOF(Append Only File)。
RDB,簡而言之,就是將存儲的數(shù)據(jù)快照的方式存儲到磁盤上,
AOF,則是將redis執(zhí)行過的所有寫指令記錄下來,通過write函數(shù)追加到AOF文件的末尾。在下次redis重新啟動時,只要把這些寫指令從前到后再重復(fù)執(zhí)行一遍,就可以實現(xiàn)數(shù)據(jù)恢復(fù)了。
?
其實RDB和AOF兩種方式也可以同時使用,在這種情況下,如果redis重啟的話,則會優(yōu)先采用AOF方式來進(jìn)行數(shù)據(jù)恢復(fù),這是因為AOF方式的數(shù)據(jù)恢復(fù)完整度更高。
如果你沒有數(shù)據(jù)持久化的需求,也完全可以關(guān)閉RDB和AOF方式,這樣的話,redis將變成一個純內(nèi)存數(shù)據(jù)庫,就像memcache一樣。
?
?RDB
RDB(Redis DataBase),是將redis某一時刻的數(shù)據(jù)持久化到磁盤中,是一種快照式的持久化方法。默認(rèn)的文件名為dump.rdb。
redis在進(jìn)行數(shù)據(jù)持久化的過程中,會先將數(shù)據(jù)寫入到一個臨時文件中,待持久化過程都結(jié)束了,才會用這個臨時文件替換上次持久化好的文件,以確保數(shù)據(jù)完整可用。
save 300 10 #300秒內(nèi)容如超過10個key被修改,則發(fā)起快照保存?
不過,由于快照方式是在一定間隔時間做一次的,如果對數(shù)據(jù)的完整性非常敏感,那么RDB方式就不太適合你,因為即使你每2分鐘都持久化一次,當(dāng)redis故障時,仍然會有近2分鐘的數(shù)據(jù)丟失。所以,redis還提供了另一種持久化方式,那就是AOF。
?
?AOF
AOF(Append Only File),即只允許追加不允許改寫的文件。
Redis會將收到的每一個寫操作(如SET等)通過write函數(shù)追加到AOF文件的末尾。默認(rèn)的AOF持久化策略是每秒鐘fsync一次(把緩存中的寫指令記錄到磁盤中)。
?
當(dāng)Redis重啟時會通過重新執(zhí)行文件中保存的寫命令來在內(nèi)存中重建整個數(shù)據(jù)庫的內(nèi)容。
appendonly yes #啟用aof持久化方式# appendfsync always #每次收到寫命令就立即強(qiáng)制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用appendfsync everysec #每秒鐘強(qiáng)制寫入磁盤一次,在性能和持久化方面做了很好的折中,推薦# appendfsync no #完全依賴os,性能最好,持久化沒保證
但AOF方式是將所有的命令記錄下來,所以AOF文件要比RDB文件的體積大。而且,恢復(fù)速度也要慢于RDB方式。
?
redis提供了bgrewriteaof命令,會重新生成一個全新的AOF文件,其中便包括了可以恢復(fù)現(xiàn)有數(shù)據(jù)的最少的命令集。
?
需要注意到是重寫aof文件的操作,并沒有讀取舊的aof文件,而是將整個內(nèi)存中的數(shù)據(jù)庫內(nèi)容用命令的方式重寫了一個新的aof文件,這點和快照有點類似。
?
?如何選擇RDB和AOF
對于我們應(yīng)該選擇RDB還是AOF,取決于具體的應(yīng)用場景,官方的建議是兩個同時使用。這樣可以提供更可靠的持久化方案。
?
總結(jié)
以上是生活随笔為你收集整理的Redis总结(四)Redis 的持久化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 富士施乐打印机-查看端口号
- 下一篇: Angularjs 如何在 post 请