APP開發(fā)對于Redis數(shù)據(jù)庫兩種機制的了解
Redis是一個支持持久化操作的內存數(shù)據(jù)庫,通過持久化機制把內存中的數(shù)據(jù)保存在硬盤文件。當Redis重啟后通過把硬盤文件重新加載到內存,就能達到恢復數(shù)據(jù)的目的。Redis常用的持久化機制有下面兩種。
·RDB
·AOF
深圳APP開發(fā)公司就為您詳細講述這兩種持久化機制
1. RDB機制
RDB是Redis默認的持久化方式,這種方式是按照一定的時間周期策略把內存的數(shù)據(jù)以快照的形式寫入到硬盤的二進制文件。RDB默認的數(shù)據(jù)文件是dump. rdb,該數(shù)據(jù)文件能在配置文件中修改。
下面是Redis配置文件中有關RDB的主要參數(shù)
dbfilename dump. rdb#快照的文件名
dir /var/lib/redis/6379#快照保存的路徑
save 900l #當有1個數(shù)據(jù)被改變時,900秒刷新到硬盤次
save 300 10 #當有10個數(shù)據(jù)被改變時,300秒刷新到硬盤次
save 60 10000 #當有10 000數(shù)據(jù)被改變時,60秒刷新到硬盤次
執(zhí)行RDB持久化的過程如圖7-19所示
APP開發(fā)示意圖之7-19RDB持久化的過程
在圖7-19中.RDB持久化的過程如下
l.根據(jù)配置文件中執(zhí)行RDB的時機.Redis調用fork生成子進程,這樣就有了Redis的子進程和父進程。
2.父進程繼續(xù)處理客戶端發(fā)送的請求,子進程把其內存的數(shù)據(jù)寫入到臨時文件由于Linux操作系統(tǒng)的特性,父進程和子進程會共享相同的內存空間,所以子進程的數(shù)據(jù)是和fork時Redis中內存的數(shù)據(jù)樣的。
3.子進程寫入臨時文件完畢后,用臨時文件替換RDB的數(shù)據(jù)文件子進程退出。
需要注意的是,每次持久化的過程都是把Redis內存數(shù)據(jù)完整地寫入到磁盤,并不是只寫入修改的數(shù)據(jù),因此,如果Redis內存數(shù)據(jù)量大那么就會造成頻繁的寫入操作,可能會嚴重影響性能。
由于RDB的方式是每隔一段時間才把內存數(shù)據(jù)持久化,如果Redis意外退出會丟失最后次持久化后的所有數(shù)據(jù)。為了防止這個問題,可以采用下面介紹的另外種持久化方式AOF。
2.AOF機制
使用AOF的持久化方式,Redis會把每個寫入命令通過write函數(shù)追加到持久化文件中(默認文件是Appendonlv. aof)當Redis重啟的時候會通過執(zhí)行持久化文件的寫命令重建內存數(shù)據(jù)。
由于Linux會把對文件的寫入數(shù)據(jù)通過buffer緩沖,因此Linux可能不是立即寫入到文件,有丟失數(shù)據(jù)的風險。在Redis的配置文件中,可以通過相應的配置選項告i斥Redis需要通過fsvne函數(shù)強制Linux寫入到磁盤的時機。下面是Redis配置叉件中有關AOF持久化的主要參數(shù)
Appendonly no #是否開啟AOF的持久化方式
Appendfilename”Appendonly.aof” #AOF文件的名稱,默認為Appendonly.aof
# Appendfsyne always #每次收到寫命令就立即強制寫入到磁盤,能保證完全持久化,但速度也最慢,不推薦
Appendfsyne everysec #每秒鐘強制寫入磁盤次,在性能和持久化方面做了很好的折中,推薦
# Appendfsyne #完全依賴Linux.性能最好,但持久化沒保證
用AOF的持久化方式會慢慢出現(xiàn)一個問題:AOF文件會變得越來越大。例如,有一個寫命令“set n um l”,然后執(zhí)行了100次寫命令“incr num”,這時num的值為101這100次“l(fā)ncr”操作都會記錄到持久化文件,但重建內存數(shù)據(jù)時,實際只需要執(zhí)行“set nu m 101”就可以了,無須先執(zhí)行“set nmn 1”在執(zhí)行100次“iucr nuni”。
為了壓縮AOF文件,Redis提供了bgrewriteaof命令,Redis收到這個命令后臺以類似創(chuàng)建RDB文件的方式將內存數(shù)據(jù)以命令的形式保存到臨時文件中,最后替換原文件。
下面是Redis配置文件中有關bgrewriteaof命令的主要參數(shù)
no-Appendfsync -nor rewrite yes #在日志重寫時,不進行命令追加,而將其放在緩沖區(qū)中
aut-aof-rewrite -prcentage 100 #當前AOF文件大小是上次日志重寫的AOF文件大小的二倍時,自動啟動新的日志重寫過程。
auto-aof-rewrite-min-size 64mb #當前AOF文件重寫的最少值
當“auto-aof-rewrite-perceutage”和“auto-aof-rewrite-min-size”這兩個條件部滿足時,才會觸發(fā)bgrewriteaof命令。
執(zhí)行bgrewriteaof命令過程如圖7-20所示。
APP開發(fā)執(zhí)行bgrewriteaof命令過程示意圖
圖7-20執(zhí)行bgrewriteaof命令過程如下
l.Redis調用fork生成于進程,這樣就有了Redis的子進程和父進程。
2.父進程繼續(xù)處理客戶端發(fā)送的請求,子進程把內存數(shù)據(jù)以命令的形式寫入到臨時文件。由于Linux操作系統(tǒng)的特性,父進程和子進程
會共享相同的內存空間,所以子進程的數(shù)據(jù)是和fork時Redis中內存的數(shù)據(jù)一致的。
3.在子進程寫臨時文件的過程中,父進程把收到的寫命令緩存起來。
4.子進程寫入臨時文件完畢,子進程通知父進程,父進程把緩存中的寫入命令追加到臨時文件
5.臨時文件替換AOF文件,父進程繼續(xù)把新增的寫命令追加到AOF文件,子進程退出。好了,APP開發(fā)公司本文對Redis數(shù)據(jù)庫的特性以及操作流程經(jīng)驗分享就到這里。謝謝關注,博納網(wǎng)絡編輯整理。