自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Redis持久化基石RDB與AOF

開(kāi)發(fā) 前端 Redis
其實(shí)在我們工作中也有多持久化場(chǎng)景,比如word。它的持久化形式是以~$論文.docx的形式來(lái)持久化。在Redis中為了防止數(shù)據(jù)意外丟失,確保數(shù)據(jù)安全,也會(huì)進(jìn)行持久化。

[[411832]]

Redis持久化

為什么需要持久化

其實(shí)在我們工作中也有多持久化場(chǎng)景,比如word。它的持久化形式是以~$論文.docx的形式來(lái)持久化。

那么在Redis中為了防止數(shù)據(jù)意外丟失,確保數(shù)據(jù)安全,也會(huì)進(jìn)行持久化。

利用永久性存儲(chǔ)介質(zhì)將數(shù)據(jù)進(jìn)行保存,在特定的時(shí)間將保存的數(shù)據(jù)進(jìn)行恢復(fù)的工作機(jī)制稱(chēng)為持久化。

在Redis中有兩種持久化方式:RDB(Redis DataBase)、AOF(Append Only File)。

RDB(Redis DataBase)將當(dāng)前數(shù)據(jù)狀態(tài)進(jìn)行保存,快照形式,存儲(chǔ)數(shù)據(jù)結(jié)果,存儲(chǔ)格式簡(jiǎn)單,關(guān)注點(diǎn)在數(shù)據(jù)。

AOF(Append Only File)將數(shù)據(jù)的操作過(guò)程進(jìn)行保存,日志形式,存儲(chǔ)操作過(guò)程,存儲(chǔ)格式復(fù)雜,關(guān)注點(diǎn)在命令。

RDB持久化

在Redis中可以使用save命令來(lái)執(zhí)行一次RDB持久化操作.

save指令相關(guān)配置:

  1. dbfilename.dump.rdb 
  2.  說(shuō)明:設(shè)置本地?cái)?shù)據(jù)庫(kù)文件名,默認(rèn)值為dump.rdb 
  3.  
  4. dir 
  5.  說(shuō)明:設(shè)置存儲(chǔ).rdb文件的路徑 
  6.  
  7. rdbcompression yes 
  8.  說(shuō)明:設(shè)置存儲(chǔ)至本地?cái)?shù)據(jù)庫(kù)時(shí)是否壓縮數(shù)據(jù),默認(rèn)為yes,采用LZF壓縮 
  9.   
  10. rdbchecksum yes 
  11.  說(shuō)明:設(shè)置是否進(jìn)行RDB文件格式校驗(yàn),該校驗(yàn)在寫(xiě)文件和讀文件過(guò)程均進(jìn)行 

我們知道早期Redis版本是單線程的。當(dāng)我們執(zhí)行save命令時(shí)會(huì)阻塞當(dāng)前Redis服務(wù)器,直到RDB過(guò)程完成為止,有可能會(huì)造成長(zhǎng)時(shí)間阻塞,線上環(huán)境不建議使用。

那么問(wèn)題來(lái)了,既然使用save會(huì)對(duì)線上服務(wù)器造成影響,那么有沒(méi)有一種更好的持久化方式呢?答案是有的,那就是bgsave.

通過(guò)名稱(chēng)可以看出這個(gè)持久化操作是后臺(tái)執(zhí)行的,不會(huì)導(dǎo)致Redis發(fā)生阻塞。

下面看一下bgsave的工作原理:

可以看出,當(dāng)執(zhí)行bgsave命令后Redis會(huì)fork出一個(gè)子進(jìn)程,用于創(chuàng)建RDB文件進(jìn)行持久化,這樣一來(lái)就不會(huì)阻塞Redis了。但是bgsave不會(huì)立即執(zhí)行,且會(huì)消耗額外的CPU資源。

bgsave命令是針對(duì)save阻塞問(wèn)題做的優(yōu)化。Redis內(nèi)部所有涉及到RDB操作都采用bgsave的方式,save命令可以放棄使用。

bgsave指令相關(guān)配置:

  1. dbfilename.dump.rdb 
  2.  說(shuō)明:設(shè)置本地?cái)?shù)據(jù)庫(kù)文件名,默認(rèn)值為dump.rdb 
  3.  
  4. dir 
  5.  說(shuō)明:設(shè)置存儲(chǔ).rdb文件的路徑 
  6.  
  7. rdbcompression yes 
  8.  說(shuō)明:設(shè)置存儲(chǔ)至本地?cái)?shù)據(jù)庫(kù)時(shí)是否壓縮數(shù)據(jù),默認(rèn)為yes,采用LZF壓縮 
  9.   
  10. rdbchecksum yes 
  11.  說(shuō)明:設(shè)置是否進(jìn)行RDB文件格式校驗(yàn),該校驗(yàn)在寫(xiě)文件和讀文件過(guò)程均進(jìn)行 
  12.   
  13. stop-writes-on-bgsave-error yes 
  14.  說(shuō)明:后臺(tái)存儲(chǔ)如果出現(xiàn)錯(cuò)誤,是否停止保存操作 

那么問(wèn)題又來(lái)了,我們不可能一直手動(dòng)去執(zhí)行或者bgsave指令,這時(shí)Redis為我們提供了自動(dòng)執(zhí)行bgsave的功能。

在Redis的配置文件中有這么一個(gè)配置save [secone] [changes]可以幫助我們自動(dòng)進(jìn)行持久化。

  1. 配置: 
  2.  save second changes 
  3.   
  4. 作用: 
  5.  滿(mǎn)足限定時(shí)間范圍內(nèi)key的變化數(shù)量達(dá)到指定數(shù)量即進(jìn)行持久化 
  6.   
  7. 參數(shù): 
  8.  second:監(jiān)控時(shí)間范圍 
  9.  changes:監(jiān)控key的變化量 
  10.   
  11. 位置: 
  12.  在conf文件中進(jìn)行配置 
  13.   
  14. 范例: 
  15.  save 900 1 
  16.  save 300 10 
  17.  save 60 10000 

注意: save配置要根據(jù)實(shí)際業(yè)務(wù)情況進(jìn)行設(shè)置,頻度過(guò)高或過(guò)低都會(huì)出現(xiàn)性能問(wèn)題,結(jié)果可能是災(zāi)難性的 save配置中對(duì)于second與changes設(shè)置通常具有互補(bǔ)對(duì)應(yīng)關(guān)系,盡量不要設(shè)置成包含性關(guān)系 save配置啟動(dòng)后執(zhí)行的是bgsave操作

RDB三種持久化方式對(duì)比:

RDB的優(yōu)點(diǎn):

  • RDB是一個(gè)緊湊的壓縮二進(jìn)制文件,存儲(chǔ)效率高
  • RDB是內(nèi)部存儲(chǔ)的在Redis某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)快照,非常適用于數(shù)據(jù)備份,全量復(fù)制等場(chǎng)景
  • RDB恢復(fù)數(shù)據(jù)的速度要比AOF快的多
  • 服務(wù)器每X個(gè)小時(shí)執(zhí)行bgsave備份,并將RDB文件拷貝至遠(yuǎn)程機(jī)器中,用于災(zāi)難恢復(fù)

RDB的缺點(diǎn):

  • RDB無(wú)論是執(zhí)行指令還是利用配置,都無(wú)法做到實(shí)時(shí)持久化,具有較大的可能性丟失數(shù)據(jù)
  • bgsave每次執(zhí)行都會(huì)fork創(chuàng)建子進(jìn)程,要犧牲掉一些性能
  • Redis眾多版本中,沒(méi)有對(duì)RDB文件格式統(tǒng)一,有可能出現(xiàn)各版本數(shù)據(jù)不兼容的情況

AOF持久化

AOF(Append Only File)持久化,以獨(dú)立日志的方式記錄每次寫(xiě)命令,重啟時(shí)再重新執(zhí)行AOF文件中的命令達(dá)到恢復(fù)數(shù)據(jù)的目的。與RDB相比可以簡(jiǎn)單描述為數(shù)據(jù)產(chǎn)生的過(guò)程。

AOF主要作用是解決了持久化的實(shí)時(shí)性,目前已經(jīng)是Redis持久化的主流方式。

AOF持久化過(guò)程

在把AOF命令緩沖區(qū)同步到文件時(shí)有三種寫(xiě)數(shù)據(jù)策略(appendfsync):

  1. always(每次) 
  2.  每次寫(xiě)入操作均同步到AOF文件中,數(shù)據(jù)零誤差,但性能較低 
  3.   
  4. everysec(每秒) 
  5.  每秒將緩沖區(qū)中的指令同步到AOF文件中,數(shù)據(jù)準(zhǔn)確性較高,性能也較高 
  6.  在系統(tǒng)突然宕機(jī)是會(huì)丟失1秒內(nèi)的數(shù)據(jù) 
  7.   
  8. no(系統(tǒng)控制) 
  9.  由操作系統(tǒng)每次同步到AOF文件的周期,整體過(guò)程不可控 

Redis開(kāi)啟AOF功能持久化

配置:

  1. appendonly yes|no 
  2.  作用:是否開(kāi)啟AOF持久化,默認(rèn)為不開(kāi)啟狀態(tài) 
  3.   
  4. appendfsync always|everysec|no 
  5.  作用:AOF同步命令數(shù)據(jù)策略 
  6.   
  7. appendfilename filename 
  8.  AOF持久化文件名,默認(rèn)文件名為appendonly.aof,建議配置成appendonly-端口號(hào).aof 

AOF在遇到相同命令是如何處理呢

假如同步策略是 appendfsync everysec每秒同步一次,執(zhí)行如下命令:

  1. set name zhangsan 
  2. set name lisi 
  3. set name wangwu 

最終AOF文件里將只有一條:

  1. set name wangwu 

AOF重寫(xiě)

隨著AOF文件不斷寫(xiě)入,AOF文件會(huì)越來(lái)越大,為了解決這個(gè)問(wèn)題,Redis引入了AOF重寫(xiě)機(jī)制壓縮文件體積。

AOF文件重寫(xiě)是將Redis進(jìn)程內(nèi)的數(shù)據(jù)轉(zhuǎn)化為寫(xiě)命令同步到新AOF文件的過(guò)程。簡(jiǎn)單說(shuō)就是將若干條命令執(zhí)行結(jié)果轉(zhuǎn)化成最終結(jié)果數(shù)據(jù)對(duì)應(yīng)的指令進(jìn)行記錄。

AOF 重寫(xiě)的作用

  • 降低磁盤(pán)占用量,提高磁盤(pán)利用率
  • 提高持久化效率,降低持久化時(shí)間,提高IO性能
  • 降低數(shù)據(jù)恢復(fù)的時(shí)間,提高數(shù)據(jù)恢復(fù)效率

AOF重寫(xiě)的規(guī)則

  • 進(jìn)程內(nèi)已經(jīng)超時(shí)的命令不再寫(xiě)入文件
  • 忽略無(wú)效指令,重寫(xiě)時(shí)使用進(jìn)程內(nèi)數(shù)據(jù)直接生成,這樣新的AOF中只保留最終數(shù)據(jù)的寫(xiě)入命令
  1. del key1 
  2. hdel key2 
  • 對(duì)同一數(shù)據(jù)寫(xiě)命令合并為一條命令
  1. 如下命令: 
  2. lpush list1 a、lpush list1 b、 lpush list1 c 
  3. 可以轉(zhuǎn)化為: 
  4. lpush list1 a b c。 
  5.  
  6. 為防止數(shù)據(jù)量過(guò)大造成客戶(hù)端緩沖區(qū)溢出,對(duì)list、set、hash、zset等類(lèi)型,每條指令最多寫(xiě)入64個(gè)元素 

AOF重寫(xiě)規(guī)則

  • 手動(dòng)重寫(xiě)
  1. bgrewriteaof 
  • 自動(dòng)重寫(xiě)
  1. auto-aof-rewrite-min-size size 
  2. auto-aof-rewrite-percentage percentage 

AOF重寫(xiě)流程

AOF持久化+重寫(xiě):

  • 執(zhí)行set等命令
  • 主進(jìn)程先是執(zhí)行這條命令,緊接著fork一個(gè)子進(jìn)程,用于往AOF緩存區(qū)和AOF重寫(xiě)緩存區(qū)寫(xiě)命令
  • 滿(mǎn)足條件后寫(xiě)入AOF文件
  • 當(dāng)bgwriteaof執(zhí)行時(shí),同樣會(huì)fork一個(gè)子進(jìn)程從AOF重寫(xiě)緩存區(qū)讀取指令并重啟,同時(shí)提示bgwriteaof正在執(zhí)行
  • 重寫(xiě)完成后,替換原來(lái)的.aof文件

RDB與AOF的區(qū)別

RDB與AOF如何選擇

對(duì)數(shù)據(jù)敏感,建議使用默認(rèn)的AOF持久化方案

  • AOF持久化策略使用everysec,每秒鐘fsync一次。該策略可以很好的保持處理性能,當(dāng)出現(xiàn)問(wèn)題時(shí)最多丟失0-1秒鐘的數(shù)據(jù)。
  • 注意:由于AOF存儲(chǔ)體積較大,所以恢復(fù)速度較慢

數(shù)據(jù)呈現(xiàn)階段有效性,建議使用RDB持久化方案

  • 數(shù)據(jù)可以良好的做到階段內(nèi)無(wú)丟失,且恢復(fù)速度較快,階段點(diǎn)數(shù)據(jù)恢復(fù)通常使用RDB方案
  • 注意:利用RDB實(shí)現(xiàn)緊湊的數(shù)據(jù)持久化會(huì)使Redis性能降低

綜合對(duì)比

  • RDB與AOF的選擇實(shí)際上是在做一種權(quán)衡,每種都有利弊
  • 如果不能承受數(shù)分鐘以?xún)?nèi)的數(shù)據(jù)丟失,對(duì)業(yè)務(wù)非常敏感,選用AOF
  • 如果能接受數(shù)分鐘以?xún)?nèi)的數(shù)據(jù)丟失,且追求大數(shù)據(jù)集的回復(fù)速度,選用RDB
  • 災(zāi)難恢復(fù)選RDB
  • 雙保險(xiǎn)策略,同時(shí)開(kāi)啟RDB與AOF,重啟后,Redis優(yōu)先使用AOF來(lái)恢復(fù)數(shù)據(jù),降低丟失數(shù)據(jù)的量

持久化應(yīng)用場(chǎng)景

  • 應(yīng)用于搶購(gòu),限購(gòu)類(lèi)、限量發(fā)放優(yōu)惠卷、激活碼等業(yè)務(wù)的數(shù)據(jù)存儲(chǔ)設(shè)計(jì)
  • 應(yīng)用于具有操作先后順序的數(shù)據(jù)控制
  • 應(yīng)用于最新消息展示
  • 應(yīng)用于基于黑名單與白名單設(shè)定的服務(wù)控制
  • 應(yīng)用于計(jì)數(shù)器組合排序功能對(duì)應(yīng)的排名

 

責(zé)任編輯:姜華 來(lái)源: Java養(yǎng)基場(chǎng)
相關(guān)推薦

2023-05-11 09:12:35

RedisRDB日志

2024-03-26 00:03:08

Redis數(shù)據(jù)RDB

2024-09-12 08:49:53

2024-09-06 17:49:46

2021-10-18 07:43:30

RedisAOF日志RDB快照

2023-03-13 08:08:48

數(shù)據(jù)庫(kù)Redis

2019-05-17 08:55:49

RedisRDBAOF

2024-09-29 09:25:53

2021-03-10 00:02:01

Redis

2020-01-06 14:54:31

RDBAOFRedis

2020-12-11 11:40:37

RDBAOFRedis

2021-02-04 08:01:35

RedisRDBAOF

2025-03-14 08:00:00

AOFRedis數(shù)據(jù)庫(kù)

2024-12-20 12:15:06

RedisRDB持久化

2025-01-22 10:16:46

RedisRDBAOF

2021-12-12 10:29:41

AOFRedisAOF日志

2025-03-14 10:22:26

2019-11-18 16:20:48

RedisRDB數(shù)據(jù)庫(kù)

2024-11-22 08:31:32

Redis數(shù)據(jù)持久化高可用

2021-05-28 10:25:39

Redis數(shù)據(jù)庫(kù)內(nèi)存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)