redis php 持久化,详解Redis RDB持久化、AOF持久化,
詳解Redis RDB持久化、AOF持久化,
1.持久化
1.1 持久化簡介
持久化(Persistence),持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制,即把數據(如內存中的對象)保存到可永久保存的存儲設備中(如磁盤)。
?
1.2 redis持久化
redis為內存數據庫,為了防止服務器宕機以及服務器進程退出后,服務器數據丟失,Redis提供了持久化功能,即將Redis中內存數據持久化到磁盤中。Redis 提供了不同級別的持久化方式:
RDB持久化方式:可以在指定的時間間隔能對數據進行快照存儲.
AOF持久化方式:記錄每次對服務器寫的操作,當服務器重啟的時候會重新執行這些命令來恢復原始的數據,AOF命令以redis協議追加保存每次寫的操作到文件末尾.Redis還能對AOF文件進行后臺重寫,使得AOF文件的體積不至于過大.
如果服務器開啟了AOF持久化功能。服務器會優先使用AOF文件還原數據。只有關閉了AOF持久化功能,服務器才會使用RDB文件還原數據
?
2. RDB持久化
2.1 RDB文件格式
RDB文件是一個經過壓縮的二進制文件(默認的文件名:dump.rdb),由多個部分組成,RDB格式:
?
2.2 RDB文件持久化創建與載入
在 Redis持久化時, RDB 程序將當前內存中的數據庫狀態保存到磁盤文件中, 在 Redis 重啟動時, RDB 程序可以通過載入 RDB 文件來還原數據庫的狀態。
?
2.3 工作方式
當 Redis 需要保存 dump.rdb 文件時, 服務器執行以下操作:
Redis 調用forks。同時擁有父進程和子進程。
子進程將數據集寫入到一個臨時 RDB 文件中。
當子進程完成對新 RDB 文件的寫入時,Redis 用新 RDB 文件替換原來的 RDB 文件,并刪除舊的 RDB 文件。
這種工作方式使得 Redis 可以從寫時復制(copy-on-write)機制中獲益。
2.4 創建方式
SAVE
同步操作,在執行該命令時,服務器會被阻塞,拒絕客戶端發送的命令請求
redis> save復制代碼
BGSAVE
異步操作,在執行該命令時,子進程執行保存工作,服務器還可以繼續讓主線程處理客戶端發送的命令請求
redis>bgsave復制代碼
自自動創建
由于BGSAVE命令可不阻塞服務器進程下執行,可以讓用戶自定義save屬性,讓服務器每個一段時間自動執行一次BGSAVE命令(即通過配置文件對 Redis 進行設置, 讓它在“ N 秒內數據集至少有 M 個改動”這一條件被滿足時, 自動進行數據集保存操作)。
比如:
/*
服服務器在900秒之內,對數據庫進行了至少1次修改
*/Save 900 1
/*服務器在300秒之內,對數據庫進行了至少10次修改
*/Save 300 10
/*服務器在60秒之內,對數據庫進行了至少10000次修改
*/Save 60 10000復制代碼
只要滿足其中一個條件就會執行BGSAVE命令
2.5 RDB 默認配置
################################ SNAPSHOTTING? ################################
#
# Save the DB on disk:
#在給定的秒數和給定的對數據庫的寫操作數下,自動持久化操作。
#? ?save
#
save 900 1
save 300 10
save 60 10000
#bgsave發生錯誤時是否停止寫入,一般為yes
stop-writes-on-bgsave-error yes
#持久化時是否使用LZF壓縮字符串對象?
rdbcompression yes
#是否對rdb文件進行校驗和檢驗,通常為yes
rdbchecksum yes
# RDB持久化文件名
dbfilename dump.rdb
#持久化文件存儲目錄
dir ./
3. AOF持久化
3.1 AOF持久化簡介
AOF持久化是通過保存Redis服務器所執行的寫命令來記錄數據庫狀態
?
AOF持久化功能實現:
append命令追加:當AOF持久化功能處于打開狀態時,服務器執行完一個寫命令會協議格式被執行的命令追加服務器狀態的aof_buf緩沖區的末尾。
reids>SET KET VAULE
//協議格式
\r\n$3\r\nSET\r\n$3\r\nKEY\r\n$5\r\nVAULE\r\n
redis> SET msg "Ccww"
redis> SADD persistence "rdb" "aof"
redis> RPUSH size 128 256 5123.2 AOF持久化策略
AOF持久化策略(即緩沖區內容寫入和同步sync到AOF中),可以通過配置appendfsync屬性來選擇AOF持久化策略:
always:將aof_buf緩沖區中的所有內容寫入并同步到AOF文件,每次有新命令追加到 AOF 文件時就執行一次 fsync。
everysec(默認):如果上次同步AOF的時間距離現在超過一秒,先將aof_buf緩沖區中的所有內容寫入到AOF文件,再次對AOF文件進行同步,且同步操作由一個專門線程負責執行。
no:將aof_buf緩沖區中的所有內容寫入到AOF文件,但并不對AOF文件進行同步,何時同步由操作系統(OS)決定。
?
AOF持久化策略的效率與安全性:
Always:效率最慢的,但安全性是最安全的,即使出現故障宕機,持久化也只會丟失一個事件 循環的命令數據
everysec:兼顧速度和安全性,出現宕機也只是丟失一秒鐘的命令數據
No:寫入最快,但綜合起來單次同步是時間是最長的,且出現宕機時會丟失上傳同步AOF文件之后的所有命令數據。
3.3 AOF重寫
由于AOF持久化會把執行的寫命令追加到AOF文件中,所以隨著時間寫入命令會不斷增加, AOF文件的體積也會變得越來越大。AOF文件體積大對Reids服務器,甚至宿主服務器造成影響。
為了解決AOF文件體積膨脹的問題,Redis提供了AOF文件重寫(rewrite)功能:
生成一個不保存任何浪費空間的冗余命令新的AOF文件,且新舊AOF文件保存數據庫狀態一樣的
新的AOF文件是通過讀取數據庫中的鍵值對來實現的,程序無須對現有的AOF文件進行讀入,分析,或者寫入操作。
為防止緩沖區溢出,重寫處理list,hash,set以及Zset時,超過設置常量數量時會多條相同命令記錄一個集合。
Redis 2.4 可以通過配置自動觸發 AOF 重寫,觸發參數?auto-aof-rewrite-percentage(觸發AOF文件執行重寫的增長率)?以及?auto-aof-rewrite-min-size(觸發AOF文件執行重寫的最小尺寸)
AOF重寫的作用:
減少磁盤占用量
加速數據恢復
Redis服務器使用單個線程來處理命令請求,服務器大量調用aof_rewrite函數,在AOF重寫期間,則無法處理client發來的命令請求,所以AOF重寫程序放在子進程執行,好處:
AOF重寫使用子進程會造成數據庫與重寫后的AOF保存的數據不一致,為了解決這種數據不一致,redis使用了AOF重寫緩沖區實現:
?
執行命令,同時將命令追加到AOF緩沖區和AOF重寫緩沖區
當AOF子進程重寫完成后,發送一個信號給父進程,父進程將執行AOF重寫緩沖區中的所有內容寫入到新AOF文件中,新AOF文件保存的數據庫狀態將和服務器當前的數據庫狀態一致。
對新的AOF文件進行改名,原子性地覆蓋現有AOF文件,完成新舊兩個AOF文件替換處理完成。
3.4 AOF持久化默認參數
############################## APPEND ONLY MODE ###############################
#開啟AOF持久化方式
appendonly no
#AOF持久化文件名
appendfilename "appendonly.aof"
#每秒把緩沖區的數據fsync到磁盤
appendfsync everysec
# appendfsync no
#是否在執行重寫時不同步數據到AOF文件
no-appendfsync-on-rewrite no
# 觸發AOF文件執行重寫的增長率
auto-aof-rewrite-percentage 100
#觸發AOF文件執行重寫的最小size
auto-aof-rewrite-min-size 64mb
#redis在恢復時,會忽略最后一條可能存在問題的指令
aof-load-truncated yes
#是否打開混合開關
aof-use-rdb-preamble yes
4 持久化方式總結與抉擇
4.1 RDB優缺點
RDB的優點
RDB是一個非常緊湊的文件,它保存了某個時間點得數據集,非常適用于數據集的備份,比如你可以在每個小時報保存一下過去24小時內的數據,同時每天保存過去30天的數據,這樣即使出了問題你也可以根據需求恢復到不同版本的數據集.
基于RDB文件緊湊性,便于復制數據到一個遠端數據中心,非常適用于災難恢復.
RDB在保存RDB文件時父進程唯一需要做的就是fork出一個子進程,接下來的工作全部由子進程來做,父進程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能.
與AOF相比,在恢復大的數據集的時候,RDB方式會更快一些.
RDB的缺點
如果你希望在redis意外停止工作(例如電源中斷)的情況下丟失的數據最少的話,那么RDB不適合你.雖然你可以配置不同的save時間點(例如每隔5分鐘并且對數據集有100個寫的操作),是Redis要完整的保存整個數據集是一個比較繁重的工作,你通常會每隔5分鐘或者更久做一次完整的保存,萬一在Redis意外宕機,你可能會丟失幾分鐘的數據.
RDB 需要經常fork子進程來保存數據集到硬盤上,當數據集比較大的時候,fork的過程是非常耗時的,可能會導致Redis在一些毫秒級內不能響應客戶端的請求.如果數據集巨大并且CPU性能不是很好的情況下,這種情況會持續1秒,AOF也需要fork,但是你可以調節重寫日志文件的頻率來提高數據集的耐久度.
4.2 AOF的優缺點
AOF的優點:
使用AOF 會讓你的Redis更加耐久:使用不同的fsync策略:無fsync,每秒fsync,每次寫的時候fsync.使用默認的每秒fsync策略,Redis的性能依然很好(fsync是由后臺線程進行處理的,主線程會盡力處理客戶端請求),一旦出現故障,你最多丟失1秒的數據.
AOF文件是一個只進行追加的日志文件,所以不需要寫入seek,即使由于某些原因(磁盤空間已滿,寫的過程中宕機等等)未執行完整的寫入命令,你也可使用redis-check-aof工具修復問題.
Redis可以在AOF文件體積變得過大時,自動對 AOF 進行重寫: 重寫后的新 AOF 文件包含了恢復當前數據集所需的最小命令集合。 整個重寫操作是絕對安全的,因為 Redis 在創建新 AOF 文件的過程中,會繼續將命令追加到現有的 AOF 文件里面,即使重寫過程中發生停機,現有的 AOF 文件也不會丟失。 而一旦新 AOF 文件創建完畢,Redis 就會從舊 AOF 文件切換到新 AOF 文件,并開始對新 AOF 文件進行追加操作。
AOF 文件有序地保存了對數據庫執行的所有寫入操作, 這些寫入操作以 Redis 協議的格式保存, 因此 AOF 文件的內容非常容易被人讀懂, 對文件進行分析(parse)也很輕松。 導出(export) AOF 文件也非常簡單(例如, 如果你不小心執行了 FLUSHALL 命令, 但只要 AOF 文件未被重寫, 那么只要停止服務器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重啟 Redis , 就可以將數據集恢復到 FLUSHALL 執行之前的狀態)。
AOF 缺點:
對于相同的數據集來說,AOF 文件的體積通常要大于 RDB 文件的體積。
根據所使用的 fsync 策略,AOF 的速度可能會慢于 RDB 。 在一般情況下, 每秒 fsync 的性能依然非常高, 而關閉 fsync 可以讓 AOF 的速度和 RDB 一樣快, 即使在高負荷之下也是如此。 不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間(latency)。
4.3 如何選擇使用哪種持久化方式?
一般來說, 如果想達到數據安全性, 你應該同時使用兩種持久化功能。
如果你非常關心你的數據, 但仍然可以承受數分鐘以內的數據丟失, 那么你可以只使用 RDB 持久化。
有很多用戶都只使用 AOF 持久化, 但并不推薦這種方式: 因為定時生成 RDB 快照(snapshot)非常便于進行數據庫備份, 并且 RDB 恢復數據集的速度也要比 AOF 恢復的速度要快, 除此之外, 使用 RDB 還可以避免之前提到的 AOF 程序的 bug 。
http://www.dengb.com/PHPjc/1381575.htmlwww.dengb.comtruehttp://www.dengb.com/PHPjc/1381575.htmlTechArticle詳解Redis RDB持久化、AOF持久化, 1.持久化 1.1 持久化簡介 持久化(Persistence),持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制,...
總結
以上是生活随笔為你收集整理的redis php 持久化,详解Redis RDB持久化、AOF持久化,的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php swiper 下拉刷新,Swip
- 下一篇: 量产 php是什么,php文件怎么打开?