1、數據庫概述;
2、持久化的做用以及實現方式;
3、RDB持久化方式配置;
4、AOF持久化方式配置;linux
Redis是一種高級key-value數據庫。它跟memcached相似,不過數據能夠持久化,並且支持的數據類型很豐富。有字符串,鏈表,集 合和有序集合。支持在服務器端計算集合的並,交和補集(difference)等,還支持多種排序功能。因此Redis也能夠被當作是一個數據結構服務器。
redis
做用:
Redis的全部數據都是保存在內存中,若是沒有配置持久化,redis重啓後數據就全丟失了,因而須要開啓redis的持久化功能,將數據保存到磁盤上,當redis重啓後,能夠從磁盤中恢復數據。那麼不按期的經過異步方式保存到磁盤上(半持久化模式);也能夠把每一次數據變化都寫入到一個append only file裏面(全持久化模式)。 如若在服務器中開啓了兩種持久化的方式,默認執行AOF持久化方式;
實現方式:
RDB持久化:將Reids在內存中的數據庫記錄定時dump到磁盤上,相似於快照功能。
AOF持久化:append only file--原理是將Reids的操做日誌以追加的方式寫入文件,近似實時性。
兩者的區別:
RDB持久化是指在指定的時間間隔內將內存中的數據集快照寫入磁盤,實際操做過程是fork一個子進程,先將數據集寫入臨時文件,寫入成功後,再替換以前的文件,用二進制壓縮存儲。
AOF持久化是以日誌的形式記錄服務器所處理的每個寫、刪除操做,查詢操做不會記錄,以文本的方式記錄,能夠打開文件看到詳細的操做記錄。數據庫
RDB的優點:
1). 一旦採用該方式,那麼你的整個Redis數據庫將只包含一個文件,這對於文件備份而言是很是完美的。好比,你可能打算每一個小時歸檔一次最近24小時的數據,同時還要天天歸檔一次最近30天的數據。經過這樣的備份策略,一旦系統出現災難性故障,咱們能夠很是容易的進行恢復。
2). 對於災難恢復而言,RDB是很是不錯的選擇。由於咱們能夠很是輕鬆的將一個單獨的文件壓縮後再轉移到其它存儲介質上。
3). 性能最大化。對於Redis的服務進程而言,在開始持久化時,它惟一須要作的只是fork出子進程,以後再由子進程完成這些持久化的工做,這樣就能夠極大的避免服務主進程執行IO操做了。
4). 相比於AOF機制,若是數據集很大,RDB的啓動效率會更高。
RDB的劣勢:
1). 若是你想保證數據的高可用性,即最大限度的避免數據丟失,那麼RDB將不是一個很好的選擇。由於系統一旦在定時持久化週期以內出現宕機現象,此前沒有來得及寫入磁盤的數據都將丟失。
2). 因爲RDB是經過fork子進程來協助完成數據持久化工做的,所以,若是當數據集較大時,可能會致使整個服務器中止服務幾百毫秒,甚至是1秒鐘。緩存
AOF的優點:
1). 該機制能夠帶來更高的數據安全性,即數據持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不一樣步。事實上,每秒同步也是異步完成的,其效率也是很是高的,所差的是一旦系統出現宕機現象,那麼這一秒鐘以內修改的數據將會丟失。而每修改同步,咱們能夠將其視爲同步持久化,即每次發生的數據變化都會被當即記錄到磁盤中。能夠預見,這種方式在效率上是最低的。
2). 因爲該機制對日誌文件的寫入操做採用的是append模式,所以在寫入過程當中即便出現宕機現象,也不會破壞日誌文件中已經存在的內容。然而若是咱們本次操做只是寫入了一半數據就出現了系統崩潰問題,不用擔憂,在Redis下一次啓動以前,咱們能夠經過redis-check-aof工具來幫助咱們解決數據一致性的問題。
3). 若是日誌過大,Redis能夠自動啓用rewrite機制。即Redis以append模式不斷的將修改數據寫入到老的磁盤文件中,同時Redis還會建立一個新的文件用於記錄此期間有哪些修改命令被執行。所以在進行rewrite切換時能夠更好的保證數據安全性。
4). AOF包含一個格式清晰、易於理解的日誌文件用於記錄全部的修改操做。事實上,咱們也能夠經過該文件完成數據的重建。
AOF的劣勢:
1). 對於相同數量的數據集而言,AOF文件一般要大於RDB文件。RDB 在恢復大數據集時的速度比 AOF 的恢復速度要快。
2). 根據同步策略的不一樣,若是在數據量比較大的狀況下,AOF在運行效率上每每會慢於RDB。安全
應用場景:
1). 願意犧牲一些性能(選擇AOF);
2). 換取更高的緩存一致性,保證數據庫最高可能的完整性(選擇AOF);
3). 願意寫操做頻繁的時候,不啓用備份來換取更高的性能,待手動運行save的時候,再作備份(RDB);服務器
環境準備:根據「Redis高性能數據庫」安裝Redis服務;數據結構
[root@redis ~]# vi /usr/local/redis/redis.conf 218 save 900 1 ##開啓RDB快照功能,在900秒內完成一個key值得變更觸發快照功能,如若將全部save配置項都註釋掉,那麼則將關閉RDB快照功能 219 save 300 10 220 save 60 10000 235 stop-writes-on-bgsave-error yes ##當RDB快照後臺進程失敗,不影響用戶得寫操做 241 rdbcompression yes ##是否將RDB快照文件壓縮,關閉後會增長性能 250 rdbchecksum no ##關閉RDB快照文件的檢查校驗,增長性能 253 dbfilename dump.rdb ##快照文件的名稱 263 dir ./ ##快照文件的存儲路徑,./爲redis的安裝目錄下 [root@redis redis]# /etc/init.d/redis restart [root@redis redis]# redis -h 192.168.100.101 -p 6379 -a 123123 192.168.100.101:6379> set haha hehe OK 192.168.100.101:6379> set name 111 OK 192.168.100.101:6379> keys * 1) "haha" 2) "name" 192.168.100.101:6379> exit [root@redis redis]# reboot ##重啓後驗證key值是否仍是存在 [root@redis redis]# redis -h 192.168.100.101 -p 6379 -a 123123 192.168.100.101:6379> keys * 1) "haha" 2) "name" 192.168.100.101:6379> exit
[root@redis ~]# vi /usr/local/redis/redis.conf
218 #save 900 1
219 #save 300 10
220 #save 60 10000
672 appendonly yes ##開啓AOF持久化方式
676 appendfilename "appendonly.aof" ##指定持久化的文件
702 appendfsync everysec ##頻率,具體參數見下方表一
724 no-appendfsync-on-rewrite no ##如若設置爲yes,則redis執行的命令會存放到緩衝區,待系統自動同步到硬盤
743 auto-aof-rewrite-percentage 100 ##若當前寫入的AOF文件達到了上次rewrite文件大小的100%,則觸發rewrite操做
744 auto-aof-rewrite-min-size 64mb ##設置AOF持久化重寫文件的最小值,當達到60M而且符合100%的條件時,則觸發rewrite操做
AOF 文件的生成過程具體包括命令追加,文件寫入,文件同步三個步驟。
Redis 打開 AOF 持久化功能後,Redis 在執行完一個寫命令後,都會將執行的寫命令追回到 Redis 內部的緩衝區的末尾。這個過程是命令的追加過程。 接下來,緩衝區的寫命令會被寫入到 AOF 文件,這一過程是文件寫入過程。對於操做系統來講,調用write函數並不會馬上將數據寫入到硬盤,爲了將數據真正寫入硬盤,還須要調用fsync函數,調用fsync函數便是文件同步的過程。只有通過文件同步過程,AOF 文件纔在硬盤中真正保存了 Redis 的寫命令。appendfsync 配置選項正是用來配置將寫命令同步到文件的頻率的,各個選項的值的含義如表 1 所示。而值爲no的話表示爲寫入AOF文件,可是不進行磁盤同步,根據linux系統默認進行磁盤同步,默認30s,效率是最高的;app
[root@redis ~]# /etc/init.d/redis restart [root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123 192.168.100.101:6379> keys * 1) "haha" 2) "name" 192.168.100.101:6379> set benet cloud OK 192.168.100.101:6379> keys * 1) "benet" 2) "haha" 3) "name" 192.168.100.101:6379> get benet "cloud" 192.168.100.101:6379> exit [root@redis ~]# cat /root/appendonly.aof *2 $6 SELECT $1 0 *3 $3 set $4 haha $1 1 *3 $3 set $4 name $1 2 *3 $3 set $5 benet $4 accp [root@redis ~]# reboot ##重啓後驗證key是否存在 [root@redis ~]# /etc/init.d/redis restart [root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123 192.168.100.101:6379> keys * 1) "name" 2) "haha" 3) "benet" 192.168.100.101:6379> exit