Redis學習(二) 一發入魂,瞭解Redis中的持久化選項AOF和RDB

哪裏也不能去,就衝學習唄!考研最重要,技術也不能丟啊…

在這裏插入圖片描述

       與mysql不同,Redis 是在內存中跑的,這是它快的一個原因,隨之帶來的就是數據容易丟失,所以我們要做持久化。

       Redis中提供了兩種持久化選項,分別是AOF和RDB。

       區別在於,AOF方式會將被執行的寫命令保存起來做持久化,而RDB方式則會將某一時刻的所有數據都持久化到文件中,也就是"快照".

1. 使用RDB快照的方法

  1. BGSAVE命令:客戶端可以向Redis發送一個BGSAVE命令來創建快照。Redis 會fork一個子進程來負責創建快照,父進程則繼續接收命令請求。
  2. SAVE命令 :客戶端也可以發送SAVE命令來創建快照,不同的是,SAVE使得Redis在創建快照的時候不再接收任何命令請求。所以我們也看得出來這並不友好,所以也不常用。
  3. 配置save選項:我們可以在redis.conf中配置save選項,例如save 60 10000 代表的意思是從redis最近一次執行快照持久化開始,當在60s內,有10000次寫操作,redis就會執行一次快照。
  4. redis服務器關閉時觸發:當服務器要關閉時,會執行一個SAVE 命令,這個命令會阻塞所有客戶端,並且在SAVE命令執行完畢後,關閉服務器。

       除此之外,我們還可以指定dbfilename參數來告訴redis,快照生成的文件應該放在哪裏。

2. 使用AOF持久化的方法

       我們可以通過在redis.conf中指定appendonly yes來開啓AOF持久化,默認是appendonly no.

       在使用AOF持久化的時候,還有一個參數配置值得我們注意,那就是跟同步頻率相關的appendfsync ,這裏的同步指的是將寫命令寫入到磁盤中,同樣是在redis.conf配置中,默認配置如下

#If unsure, use “everysec”.

#appendfsync always

appendfsync everysec
#appendfsync no

redis官方說的很清楚,如果不確定你要用什麼請用everysec,並且我們可以發現註釋掉了always和no兩種情況,那麼這三種情況都是什麼意思呢?

選項 效用
everysec 每秒執行一次同步,即寫入磁盤
always 每個寫命令,都寫入到磁盤中
no 由操作系統決定什麼時候寫入磁盤

有的同學就要說了,每個寫命令,都寫入到磁盤中,這不是挺好的嘛? 看起來挺好的,其實不然,always選項讓redis每次只寫一個命令到磁盤中,這種不斷第寫入少量數據的做法會引起問題。

3. 重寫AOF文件

前面我們可以明顯對比到,AOF每次只將寫命令保存起來,佔用體積相比RDB快照方式會小一些吧?其實不一定,隨着redis的不斷運行,AOF文件可能會不斷堆積,這種情況下,佔用的體積就會很大。

怎麼辦呢?

可以在客戶端向redis服務器發送BGREWRITEAOF命令,這個命令會通過移除AOF文件中的冗餘命令,來重寫AOF文件,使得AOF文件的體積儘可能小。
在這裏插入圖片描述
不幸的是,這個命令和快照持久化中的BGSAVE原理一樣,都是fork一個子進程來完成工作。所以當你使用該命令重寫特別大的AOF文件時,可能會導致我們的系統掛起幾秒鐘。

除此之外,AOF持久化中也提供了類似於前面save配置一樣的功能,通過auto-aof-rewrite-percentageauto-aof-rewrite-min-size 兩個參數來指定。

例如,下面是redis 默認配置

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

如果你開啓了AOF持久化,那麼當你的AOF文件大於64MB,並且AOF文件的體積比上一次重寫之後的體積大了至少100%,那麼就會執行BGREWRITEAOF命令來重寫AOF文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章