Redis 是一個鍵值對數據庫服務器。基於內存存儲數據,它常被用作緩存數據庫,用來替代 memcached。官網:https://redis.io/mysql
持久化,指將數據存儲到可永久保存的設備中。
例如,將內存中的數據存儲到可永久保存的硬盤中。redis
甚至,一些特別重要的數據,是須要存到 MySQL 的。
Redis 自己有持久化,爲何還要寫進 mysql 呢?:https://www.v2ex.com/t/219551sql
Redis 提供了四種持久化方式:數據庫
此次主要說的是 RDB 和 AOF 兩種持久化方式。緩存
RDB:Redis database 的簡稱。一看這個,你就應該能猜到,這是 Redis 的默認持久化方式。服務器
RDB 中持久化生成的是一個通過壓縮的二進制文件。app
save 900 1 # 每900秒檢查一次,若是有1條數據修改了,那麼執行 rdb save 300 10 # 每300秒檢查一次,若是有10條數據修改了,那麼執行 rdb save 60 10000 # 每60秒檢查一次,若是有10000條數據修改了,那麼執行 rdb
服務器啓動時,會直接載入 RDB 文件。
可是若是 AOF 文件存在,則會載入 AOF 文件。AOF 文件載入過程會在後文中描述memcached
AOF 是 Append Only File 的簡稱。.net
AOF 經過保存客戶端傳過來的寫命令來記錄數據庫的狀態。
如:設計
$3(後面是 \r\n) SET $3 msg $1 5 $3 SET $3 msg $1 3
須要在配置文件中加入:
appendonly yes
主進程進行如文章末尾所示的三個步驟:
# 當前 AOF 文件超過上次重寫時的 AOF 文件大小的百分之多少時再次進行重寫 # 若是以前沒有衝寫過,則以啓動時的 AOF 文件大小爲依據。 auto-aof-rewrite-percentage 100 # 容許重寫的最小值 auto-aof-rewrite-min-size 64mb
若是是在客戶端直接執行 REWRITEAOF ,會阻塞服務,直到重寫完成,將新的 AOF 文件覆蓋舊的文件。這種方式通常不會考慮。
BGREWRITEAOF 命令的執行過程如文末圖片所示:
AOF 重寫是將多條命令用一條命令代替。
如上面代碼所示,存儲一個 msg 使用了兩條命令。通過 AOF 文件重寫以後,就會變成以下所示,大大減小了使用的存儲空間:
$3 SET $3 msg $1
AOF 文件還原的步驟以下:
AOF 寫入與重寫過程圖:
《Redis入門指南》 《Redis設計與實現》