瞭解redis的朋友應該知道它有兩種數據持久化的方式,這裡我作一個簡單的介紹,AOF(append only file)和RDB.1.RDB這是一種比較常見的方式,採用 寫時複製 的方式,效率高,速度快,介紹一下寫時複製的機制:當 Redis 需要保存 dump.rdb 文件時, 伺服器執行以下操作...
瞭解redis的朋友應該知道它有兩種數據持久化的方式,這裡我作一個簡單的介紹,AOF(append only file)和RDB.
1.RDB
這是一種比較常見的方式,採用 寫時複製 的方式,效率高,速度快,介紹一下寫時複製的機制:
當 Redis 需要保存 dump.rdb 文件時, 伺服器執行以下操作:
- Redis 調用 fork() ,同時擁有父進程和子進程。
- 子進程將數據集寫入到一個臨時 RDB 文件中。
- 當子進程完成對新 RDB 文件的寫入時,Redis 用新 RDB 文件替換原來的 RDB 文件,並刪除舊的 RDB 文件。
這種工作方式使得 Redis 可以從寫時複製(copy-on-write)機制中獲益。
這種機制使得RDB的速度非常得快,但是存在一些安全性問題,當我的redis服務因為某種原因宕了,當記憶體新增數據很龐大,子進程需要幾分鐘才能將臨時文件書寫完畢的時候。那麼在宕機之後,這幾分鐘的數據很可能就丟失了。所以處於安全性考慮的原因,我會建議使用第二種方式,AOF機制。
2.AOF
aof採用一種fsync的方式進行持久化,相比RDB的方式會相對較慢。但是相對安全,甚至可以說是絕對安全的,取決於具體的配置。他不需要子進程進行協助,他是一種將有關寫的命令append到文件的方式來記錄redis的狀態方式。aof也可以分為三種方式進行append。在此之前先打開appendonly的開關為yes.
appendfsync always (每次向記憶體中執行寫操作的時候,都執行一次fsync,相當安全,建議數據量不大的時候,又想保證數據安全性的情況下使用)
appendfsync everysec (每秒進行一次fsync,中庸之道)
appendfsync no (不建議使用)
我這裡例舉一下redis>2.2的由RDB切換到AOF的方式
[root@localhost redis-2.8.9]# redis-cli 127.0.0.1:6379> config set appendonly yes OK 127.0.0.1:6379> config set save "" OK 127.0.0.1:6379>
redis-cli進入redisShell客戶端,然後開啟aof ,關閉RDB方式。
記得修改 redis.conf裡面的配置,不然下次重啟還是使用原來的配置,讀取dump.rdb進行恢復
配置修改如下:
#save "" save "" save 900 1 #save 900 1 save 300 10 ------------------> #save 300 10 save 60 10000 #save 60 10000
appendonly no ---------------------> appendonly yes
備份文件有兩種方式
一.RBD備份方式
1.執行save命令 ,找到dump.rdb(預設放到執行命令(redis-server)的路徑下)
2.執行redis-server redis.conf (如果配置文件選擇的是RDB備份方式)
啟動之後就ok了
二.AOF備份方式
1.找到appendonly.aof(預設放到執行命令(redis-server)的路徑下)
2.執行redis-server redis.conf就可以了(如果配置文件選擇的是AOF備份方式)