玩轉redis持久化,阿里架構師給你來一篇方案介紹

clipboard.png

1、基本介紹

本次演示使用的redis版本是3.2.100,操做系統是win10。redis

redis支持兩種持久化方案,RDB和AOF,前者是默認打開的,後者須要手動開啓。咱們經過配置文件能夠驗證這一點,sql

RDB默認開啓數據庫

save 900 1
save 300 10
save 60 10000

這三條配置是RDS觸發快照的條件,它們的意思分別是:架構

  1. 900秒內若是有一條寫入,則產生快照
  2. 300秒內若是有1000次寫入,則產生快照
  3. 60秒內若是有10000次寫入,則產生快照

固然,觸發rdb快照的條件不止這些,下面會講到。併發

AOF默認關閉app

appendonly no

2、RDB介紹

RDB的方案是當知足觸發條件是,將內存中的數據以二進制的方式寫入磁盤保存,默認保存的文件叫dump.rdb(能夠改),當redis重啓時,會讀取該文件進行數據恢復。異步

查看快照文件的信息

127.0.0.1:6379> config get dbfilename
1) "dbfilename"
2) "dump.rdb"
127.0.0.1:6379> config get dir
1) "dir"
2) "C:\\redis-6379"
127.0.0.1:6379>

觸發RDB快照條件

除了上面提到的在指定時間內,指定寫次數觸發以外,下面幾種狀況也會觸發redis執行RDB快照,分佈式

  1. 手動執行save(同步阻塞)或者bgsave(異步阻塞)命令
  2. 執行flushall命令
  3. redis退出,執行shutdown命令

下面拿第一種狀況演示下,這裏會用到info Persistence命令,用來查看持久化信息。高併發

127.0.0.1:6379> info persistence
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1561595205
...省略其它
127.0.0.1:6379> save
OK
127.0.0.1:6379> info persistence
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1561595940
...省略其它
127.0.0.1:6379>

注意看rdb_last_save_time字段,說明save命令觸發了持久化。性能

3、AOF介紹

爲了演示AOF,咱們須要手動把AOF開關打開,而後重啓redis。

AOF將Redis執行的每一條寫命令追加到磁盤文件(appendonly.aof)中,若是打開了AOF,redis啓動時候優先選擇從AOF文件恢復數據。

相關配置

除了開關,和AOF相關的配置還有如下幾個:

appendfilename "appendonly.aof"   #數據庫文件名
# appendfsync always    #每一個命令都追加寫入
appendfsync everysec    #每秒寫1次
# appendfsync no        #寫入工做交給操做系統,由操做系統判斷緩衝區大小,統一寫入到aof

no-appendfsync-on-rewrite  yes:   #正在導出rdb快照的過程當中,是否中止同步aof
auto-aof-rewrite-percentage 100   #aof文件大小比起上次重寫時的大小,增加率100%時,重寫
auto-aof-rewrite-min-size 64mb    #aof文件,至少超過64M時,才重寫

重寫機制

經過前面講述的AOF的過程,聰明的你可能會想到一個問題,AOF不斷的追加命令到文件,那文件豈不是愈來愈大,時間長了對磁盤空間也是負擔啊。

你都想到了,redis的做者會想不到嗎?redis引入了重寫機制來解決這個問題。上面配置的最後兩條其實就是重寫的觸發條件,說白了意思就是:

當AOF文件大小是上次rewrite後大小的一倍且文件大於64M時觸發

除了上面的條件觸發,AOF也支持手動觸發(bgrewriteaof命令)下面用這個命令演示重寫

λ redis-cli.exe
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started
127.0.0.1:6379>

啓動日誌:

[18268] 27 Jun 09:23:41.282 # Server started, Redis version 3.2.100
[18268] 27 Jun 09:23:41.282 * The server is now ready to accept connections on port 6379
[18268] 27 Jun 09:24:03.236 * Background append only file rewriting started by pid 18740
[18268] 27 Jun 09:24:03.388 * AOF rewrite child asks to stop sending diffs.
[18268] 27 Jun 09:24:03.488 # fork operation complete
[18268] 27 Jun 09:24:03.489 * Background AOF rewrite terminated with success
[18268] 27 Jun 09:24:03.491 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB)
[18268] 27 Jun 09:24:03.496 * Background AOF rewrite finished successfully

4、總結

  1. 若是使用持久化,建議RDB和AOF都開啓,雙重保障。AOF會優先執行,若是執行失敗還有RDB
  2. RDB適合大規模數據恢復,可是完整性不如AOF,由於RDB可能在最後一次備份時宕機了
  3. RDB相對AOF比較佔用內存

寫在最後

  • 第一:看完點贊,感謝您對做者的承認;
  • ...
  • 第二:隨手轉發,分享知識,讓更多人學習到;
  • ...
  • 第三:記得點關注,天天更新的!!!
  • ...

最後,歡迎作Java的工程師朋友們加入Java高級架構進階Qqun:963944895

羣內有技術大咖指點難題,還提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)

比你優秀的對手在學習,你的仇人在磨刀,你的閨蜜在減肥,隔壁老王在練腰, 咱們必須不斷學習,不然咱們將被學習者超越!

趁年輕,使勁拼,給將來的本身一個交代!

相關文章
相關標籤/搜索