Redis學習筆記(二) Redis持久化
Redis的所有資料都是儲存在記憶體中,然後不定期的通過非同步方式儲存到磁碟上(這稱為“半持久化模式”);也可以把每一次資料變化都寫入到一個檔案裡面(這稱為“全持久化模式”)。
這裡主要介紹這兩種持久化方法
RDB方式和 AOF方式
可以單獨的使用其中一種方式,也可以將兩者結合起來一起使用
在這種情況下,當 Redis 重啟時,它會優先使用 AOF 檔案來還原資料集,因為 AOF 檔案儲存的資料集通常比 RDB 檔案所儲存的資料集更完整. 你甚至可以關閉持久化功能,讓資料只在伺服器執行時存在.
RDB 是 Redis的預設持久化方法
安裝Redis3.0.5
安裝Reids之前首先要安裝一些依賴
yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make gcc-c++ libstdc++-devel tcl
Redis下載地址:
通過wget下載Redis
wget http://download.redis.io/releases/redis-3.0.5.tar.gz
解壓檔案
tar –zxvf redis-3.0.5.tar.gz
進入Redis目錄
cd redis-3.0.5
執行make 和 make install命令
make
make install
make test 這個需要執行很長的時間 就不執行了
將redis.conf檔案拷貝到etc下面
cp redis.conf /etc/
編輯redis.conf
修改為後臺啟動
將引數daemonize 修改為 yes
RDB方式
RDB 持久化可以在指定的時間間隔內生成資料集的時間點快照(point-in-time snapshot)。
在Redis配置檔案中已經預置了3個條件
滿足其中任何一個條件就會進行快照
禁用RDB
預設的RDB的檔案路徑是在當前目錄, 檔名是 : dump.rdb,可以再配置檔案中修改路徑和檔名,分別是dir和dbfilename
Redis啟動後會讀取RDB快照檔案,將資料從硬碟中載入到記憶體,一般情況下1GB的快照檔案載入到記憶體的時間約為20~30分鐘.(不同伺服器會存在差異)
RDB的持久化過程
① Redis是使用fork函式複製一份當前程序(父程序)的副本(子程序);
② 父程序繼續接收並處理客戶端發來的命令,而子程序開始將記憶體中的資料寫入到磁碟的臨時檔案中;
③ 當子程序寫入完所有的資料後會用該臨時檔案替換掉舊的RDB檔案;
注意:
由於Redis使用fork來複制一份當前程序,那麼子程序就會佔有和主程序一樣的記憶體資源,如果主程序是8G記憶體,那麼在備份的時候必須保證有16GB的記憶體,要不然會啟用虛擬記憶體,效能非常的差,如果資料集非常巨大,也可能會影響到CPU
RBD檔案是通過壓縮的, 可以通過配置rdbcompression引數來禁用壓縮
啟動壓縮的話會佔用伺服器的CPU資源
除了Redis自動進行快照,你也可以通過命令進行手痛快照
SAVE :由主執行緒進行快照
BGSAVE :fork子程序進行快照
AOF方式
AOF 持久化記錄伺服器執行的所有寫操作命令,並在伺服器啟動時,通過重新執行這些命令來還原資料集. AOF 檔案中的命令全部以 Redis 協議的格式來儲存,新命令會被追加到檔案的末尾. Redis 還可以在後臺對 AOF 檔案進行重寫(rewrite),使得 AOF 檔案的體積不會超出儲存資料集狀態所需的實際大小
AOF持久化通過修改appendonly引數 來設定 預設是不開啟的
AOF檔案的位置和RDB檔案的位置是相同的,都是通過dir引數設定,預設的檔名是apendonly.aof,也可以通過apendfilename引數修改
AOF內容
在Redis裡面設定幾個key
檢視產生的AOF檔案
AOF把操作的日誌記錄下來,可以保證資料不丟失,但是AOF會有效能問題,每次操作都會寫一遍檔案.
查詢資料的操作是不記錄的
AOF檔案優化
我們可以使用BGREWRITEAOF命令來重寫AOF檔案
重寫策略的引數設定:
auto-aof-rewrite-percentage
表示當前AOF檔案大小超過上一次重寫時的AOF檔案大小的百分之多少時會再次進行重寫,如果之前沒有重寫過,則以啟動時的AOF檔案大小為依據.
上面的表示百分之一百
uto-aof-rewrite-min-size
表示限制允許重寫的最小AOF檔案大小,通常在AOF檔案很小的時候即使其中有些冗餘的命令也是可以忽略的.
我們使用一個hset命令來設定一個key
AOF檔案
執行BGREWRITEAOF命令之後
優化之後
檔案到磁碟的機制
檔案寫入預設情況下會先寫入到系統的快取中,系統每30秒同步一次,才是真正的寫入到硬碟中,如果在這30秒伺服器宕機的話,那麼資料也會丟失,可以通過修改Reids 配置引數來修改同步策略.