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