哪裏也不能去,就衝學習唄!考研最重要,技術也不能丟啊…
與mysql不同,Redis 是在內存中跑的,這是它快的一個原因,隨之帶來的就是數據容易丟失,所以我們要做持久化。
Redis中提供了兩種持久化選項,分別是AOF和RDB。
區別在於,AOF方式會將被執行的寫命令
保存起來做持久化,而RDB方式則會將某一時刻的所有數據
都持久化到文件中,也就是"快照".
1. 使用RDB快照的方法
- BGSAVE命令:客戶端可以向Redis發送一個
BGSAVE
命令來創建快照。Redis 會fork
一個子進程來負責創建快照,父進程則繼續接收命令請求。 - SAVE命令 :客戶端也可以發送
SAVE
命令來創建快照,不同的是,SAVE使得Redis在創建快照的時候不再接收任何命令請求。所以我們也看得出來這並不友好,所以也不常用。 - 配置save選項:我們可以在redis.conf中配置save選項,例如
save 60 10000
代表的意思是從redis最近一次執行快照持久化開始,當在60s內,有10000次寫操作,redis就會執行一次快照。 - 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-percentage
和auto-aof-rewrite-min-size
兩個參數來指定。
例如,下面是redis 默認配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
如果你開啓了AOF持久化,那麼當你的AOF文件大於64MB,並且AOF文件的體積比上一次重寫之後的體積大了至少100%,那麼就會執行BGREWRITEAOF
命令來重寫AOF文件。