網(wǎng)站開始開發(fā)階段的主要任務(wù)提供seo顧問服務(wù)適合的對(duì)象是
client redis[內(nèi)存] -----> 內(nèi)存數(shù)據(jù)- 數(shù)據(jù)持久化-->磁盤
Redis官方提供了兩種不同的持久化方法來將數(shù)據(jù)存儲(chǔ)到硬盤里面分別是:
-
RDB 快照(Snapshot)
-
AOF (Append Only File) 只追加日志文件
1 快照(Snapshot)
1. 特點(diǎn)
這種方式可以將某一時(shí)刻的所有數(shù)據(jù)都寫入硬盤中,當(dāng)然這也是redis的默認(rèn)開啟持久化方式,保存的文件是以.rdb形式結(jié)尾的文件因此這種方式也稱之為RDB方式。
2.快照生成方式
-
客戶端方式: BGSAVE 和 SAVE指令
-
服務(wù)器配置自動(dòng)觸發(fā)
# 1.客戶端方式之BGSAVE - a.客戶端可以使用BGSAVE命令來創(chuàng)建一個(gè)快照,當(dāng)接收到客戶端的BGSAVE命令時(shí),redis會(huì)調(diào)用fork來創(chuàng)建一個(gè)子進(jìn)程,然后子進(jìn)程負(fù)責(zé)將快照寫入磁盤中,而父進(jìn)程則繼續(xù)處理命令請(qǐng)求。名詞解釋: fork當(dāng)一個(gè)進(jìn)程創(chuàng)建子進(jìn)程的時(shí)候,底層的操作系統(tǒng)會(huì)創(chuàng)建該進(jìn)程的一個(gè)副本,在類unix系統(tǒng)中創(chuàng)建子進(jìn)程的操作會(huì)進(jìn)行優(yōu)化:在剛開始的時(shí)候,父子進(jìn)程共享相同內(nèi)存,直到父進(jìn)程或子進(jìn)程對(duì)內(nèi)存進(jìn)行了寫之后,對(duì)被寫入的內(nèi)存的共享才會(huì)結(jié)束服務(wù)`
# 2.客戶端方式之SAVE
- b.客戶端還可以使用SAVE命令來創(chuàng)建一個(gè)快照,接收到SAVE命令的redis服務(wù)器在快照創(chuàng)建完畢之前將不再響應(yīng)任何其他的命令
-
注意: SAVE命令并不常用,使用SAVE命令在快照創(chuàng)建完畢之前,redis處于阻塞狀態(tài),無法對(duì)外服務(wù)
# 3.服務(wù)器配置方式之滿足配置自動(dòng)觸發(fā) - 如果用戶在redis.conf中設(shè)置了save配置選項(xiàng),redis會(huì)在save選項(xiàng)條件滿足之后自動(dòng)觸發(fā)一次BGSAVE命令,如果設(shè)置多個(gè)save配置選項(xiàng),當(dāng)任意一個(gè)save配置選項(xiàng)條件滿足,redis也會(huì)觸發(fā)一次BGSAVE命令
# 4.服務(wù)器接收客戶端shutdown指令 - 當(dāng)redis通過shutdown指令接收到關(guān)閉服務(wù)器的請(qǐng)求時(shí),會(huì)執(zhí)行一個(gè)save命令,阻塞所有的客戶端,不再執(zhí)行客戶端執(zhí)行發(fā)送的任何命令,并且在save命令執(zhí)行完畢之后關(guān)閉服務(wù)器
3.配置生成快照名稱和位置
#1.修改生成快照名稱 - dbfilename dump.rdb ? # 2.修改生成位置 - dir ./
2 AOF 只追加日志文件
1.特點(diǎn)
這種方式可以將所有客戶端執(zhí)行的寫命令記錄到日志文件中,AOF持久化會(huì)將被執(zhí)行的寫命令寫到AOF的文件末尾,以此來記錄數(shù)據(jù)發(fā)生的變化,因此只要redis從頭到尾執(zhí)行一次AOF文件所包含的所有寫命令,就可以恢復(fù)AOF文件的記錄的數(shù)據(jù)集.
2.開啟AOF持久化
在redis的默認(rèn)配置中AOF持久化機(jī)制是沒有開啟的,需要在配置中開啟
# 1.開啟AOF持久化 - a.修改 appendonly yes 開啟持久化 - b.修改 appendfilename "appendonly.aof" 指定生成文件名稱
3.日志追加頻率
# 1.always 【謹(jǐn)慎使用】 - 說明: 每個(gè)redis寫命令都要同步寫入硬盤,嚴(yán)重降低redis速度 - 解釋: 如果用戶使用了always選項(xiàng),那么每個(gè)redis寫命令都會(huì)被寫入硬盤,從而將發(fā)生系統(tǒng)崩潰時(shí)出現(xiàn)的數(shù)據(jù)丟失減到最少;遺憾的是,因?yàn)檫@種同步策略需要對(duì)硬盤進(jìn)行大量的寫入操作,所以redis處理命令的速度會(huì)受到硬盤性能的限制; - 注意: 轉(zhuǎn)盤式硬盤在這種頻率下200左右個(gè)命令/s ; 固態(tài)硬盤(SSD) 幾百萬個(gè)命令/s; - 警告: 使用SSD用戶請(qǐng)謹(jǐn)慎使用always選項(xiàng),這種模式不斷寫入少量數(shù)據(jù)的做法有可能會(huì)引發(fā)嚴(yán)重的寫入放大問題,導(dǎo)致將固態(tài)硬盤的壽命從原來的幾年降低為幾個(gè)月。 ? # 2.everysec 【推薦】 - 說明: 每秒執(zhí)行一次同步顯式的將多個(gè)寫命令同步到磁盤 - 解釋: 為了兼顧數(shù)據(jù)安全和寫入性能,用戶可以考慮使用everysec選項(xiàng),讓redis每秒一次的頻率對(duì)AOF文件進(jìn)行同步;redis每秒同步一次AOF文件時(shí)性能和不使用任何持久化特性時(shí)的性能相差無幾,而通過每秒同步一次AOF文件,redis可以保證,即使系統(tǒng)崩潰,用戶最多丟失一秒之內(nèi)產(chǎn)生的數(shù)據(jù)。 ? # 3.no 【不推薦】 - 說明: 由操作系統(tǒng)決定何時(shí)同步 - 解釋:最后使用no選項(xiàng),將完全有操作系統(tǒng)決定什么時(shí)候同步AOF日志文件,這個(gè)選項(xiàng)不會(huì)對(duì)redis性能帶來影響但是系統(tǒng)崩潰時(shí),會(huì)丟失不定數(shù)量的數(shù)據(jù),另外如果用戶硬盤處理寫入操作不夠快的話,當(dāng)緩沖區(qū)被等待寫入硬盤數(shù)據(jù)填滿時(shí),redis會(huì)處于阻塞狀態(tài),并導(dǎo)致redis的處理命令請(qǐng)求的速度變慢。
4.修改同步頻率
# 1.修改日志同步頻率 - 修改appendfsync everysec|always|no 指定
3 AOF文件的重寫
1. AOF帶來的問題
AOF的方式也同時(shí)帶來了另一個(gè)問題。持久化文件會(huì)變的越來越大。例如我們調(diào)用incr test命令100次,文件中必須保存全部的100條命令,其實(shí)有99條都是多余的。因?yàn)橐謴?fù)數(shù)據(jù)庫的狀態(tài)其實(shí)文件中保存一條set test 100就夠了。為了壓縮aof的持久化文件Redis提供了AOF重寫(ReWriter)機(jī)制。
2. AOF重寫
用來在一定程度上減小AOF文件的體積
3. 觸發(fā)重寫方式
# 1.客戶端方式觸發(fā)重寫 - 執(zhí)行BGREWRITEAOF命令 不會(huì)阻塞redis的服務(wù) ? # 2.服務(wù)器配置方式自動(dòng)觸發(fā) - 配置redis.conf中的auto-aof-rewrite-percentage選項(xiàng) 參加下圖↓↓↓ - 如果設(shè)置auto-aof-rewrite-percentage值為100和auto-aof-rewrite-min-size 64mb,并且啟用的AOF持久化時(shí),那么當(dāng)AOF文件體積大于64M,并且AOF文件的體積比上一次重寫之后體積大了至少一倍(100%)時(shí),會(huì)自動(dòng)觸發(fā),如果重寫過于頻繁,用戶可以考慮將auto-aof-rewrite-percentage設(shè)置為更大
4. 重寫原理
注意:重寫aof文件的操作,并沒有讀取舊的aof文件,而是將整個(gè)內(nèi)存中的數(shù)據(jù)庫內(nèi)容用命令的方式重寫了一個(gè)新的aof文件,替換原有的文件這點(diǎn)和快照有點(diǎn)類似。
# 重寫流程 - 1. redis調(diào)用fork ,現(xiàn)在有父子兩個(gè)進(jìn)程 子進(jìn)程根據(jù)內(nèi)存中的數(shù)據(jù)庫快照,往臨時(shí)文件中寫入重建數(shù)據(jù)庫狀態(tài)的命令 - 2. 父進(jìn)程繼續(xù)處理client請(qǐng)求,除了把寫命令寫入到原來的aof文件中。同時(shí)把收到的寫命令緩存起來。這樣就能保證如果子進(jìn)程重寫失敗的話并不會(huì)出問題。 - 3. 當(dāng)子進(jìn)程把快照內(nèi)容寫入已命令方式寫到臨時(shí)文件中后,子進(jìn)程發(fā)信號(hào)通知父進(jìn)程。然后父進(jìn)程把緩存的寫命令也寫入到臨時(shí)文件。 - 4. 現(xiàn)在父進(jìn)程可以使用臨時(shí)文件替換老的aof文件,并重命名,后面收到的寫命令也開始往新的aof文件中追加。
4 持久化總結(jié)
兩種持久化方案既可以同時(shí)使用(aof),又可以單獨(dú)使用,在某種情況下也可以都不使用,具體使用那種持久化方案取決于用戶的數(shù)據(jù)和應(yīng)用決定。
無論使用AOF還是快照機(jī)制持久化,將數(shù)據(jù)持久化到硬盤都是有必要的,除了持久化外,用戶還應(yīng)該對(duì)持久化的文件進(jìn)行備份(最好備份在多個(gè)不同地方)。