Redis AOF 持久化學習筆記
文章 Redis 快照持久化學習筆記 介紹 Redis 快照持久化的功能,除了快照持久化外,Redis 還提供了 AOF(Append Only File)持久化功能。與快照持久化通過直接儲存 Redis 的鍵值對資料不同,AOF 持久化是通過儲存 Redis 執行的寫命令來記錄 Redis 的記憶體資料。
AOF 持久化的原理
理論上說,只要我們儲存了所有可能修改 Redis 記憶體資料的命令(也就是寫命令),那麼根據這些儲存的寫命令,我們可以重新恢復 Redis 的記憶體狀態。AOF 持久化正是利用這個原理來實現資料的持久化與資料的恢復的。
Redis AOF 持久化原理如圖 1 與圖 2 所示。
圖1:Redis 將寫命令儲存到 AOF 檔案中
圖2:Redis 利用 AOF 檔案還原記憶體資料
AOF 配置
為了開啟 AOF 持久化的功能,我們只需要將 redis.conf 配置檔案中的appendonly
配置選項設定為yes
即可。涉及 AOF 持久化的幾個常用配置如下所示:
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
- appendonly:是否開啟 AOF 持久化功能
- appendfilename:AOF 檔名稱
- appendfsync:同步頻率,可選配置如表1所示
表 1:appendfsync 選項及同步頻率
選項 | 同步頻率 |
---|---|
always | 每個 Redis 命令都要同步寫入硬碟。這樣會嚴重降低 Redis 的效能 |
everysec | 每秒執行一次同步,顯式地將多個寫命令同步到硬碟 |
no | 讓作業系統來決定應該何時進行同步 |
AOF 檔案的生成過程具體包括命令追加,檔案寫入,檔案同步三個步驟。
Redis 開啟 AOF 持久化功能後,Redis 在執行完一個寫命令後,都會將執行的寫命令追回到 Redis 內部的緩衝區的末尾。這個過程是命令的追加過程。
接下來,緩衝區的寫命令會被寫入到 AOF 檔案,這一過程是檔案寫入過程。對於作業系統來說,呼叫write
fsync
函式,呼叫fsync
函式即是檔案同步的過程。只有經過檔案同步過程,AOF 檔案才在硬碟中真正儲存了 Redis 的寫命令。appendfsync 配置選項正是用來配置將寫命令同步到檔案的頻率的,各個選項的值的含義如表 1 所示。
AOF 檔案
前面我們提到,AOF 持久化是通過 AOF 檔案來實現的,那麼 AOF 裡面是如何儲存 Redis 的寫命令的呢?
假設我們對一個空的 Redis 資料庫執行以下命令:
set msg hello
set site leehao.me
執行後,Redis 資料庫儲存了鍵 msg 與 site 的資料。開啟儲存的 AOF 檔案appendonly.aof
(AOF 檔案的路徑和名稱由 redis.conf 配置,具體可以參考上面 AOF 配置的描述),可以看到其內容為:
*2
$6
SELECT
$1
0
*3
$3
set
$3
msg
$5
hello
*3
$3
set
$4
site
$9
leehao.me
appendonly.aof
以 Redis 協議格式 RESP 來儲存寫命令。由於 RESP 協議中包含了換行符,所以上面展示的 AOF 檔案時遇到換行符時進行了換行。在 AOF 檔案裡面,除了用於指定資料庫的 SELECT 命令是自動新增的之外,其他都是我們通過客戶端傳送的命令。
appendonly.aof
儲存的命令會在 Redis 下次重啟時使用來還原 Redis 資料庫。
重寫 / 壓縮 AOF 檔案
由於 Redis 會不斷地將被執行的命令記錄到 AOF 檔案裡面,所以隨著 Redis 不斷執行,AOF 檔案的體積會越來越大。另外,如果 AOF 檔案的體積很大,那麼還原操作所需要的時間也會非常地長。
為了解決 AOF 檔案越來越大的問題,使用者可以向 Redis 傳送 BGREWRITEAOF 命令,這個命令會移除 AOF 檔案中冗餘的命令來重寫 AOF 檔案,使 AOF 檔案的體積變得儘可能地小。
BGREWRITEAOF 的工作原理和快照持久化命令 BGSAVE 的工作原理類似,Redis 會建立一個子程序來負責對 AOF 檔案進行重寫。
值得注意的是,進行 AOF 檔案重寫時,如果原來的 AOF 檔案體積已經非常大,那麼重寫 AOF 並刪除舊 AOF 檔案的過程將會對 Redis 的效能造成較大的影響。
為此,Redis 提供auto-aof-rewrite-percentage
和auto-aof-rewrite-min-size
兩個配置選項來對 AOF 重寫進行配置。auto-aof-rewrite-percentage
和auto-aof-rewrite-min-size
兩個配置選項的含義可以參考 redis.conf 配置中的詳細說明,具體來說,auto-aof-rewrite-percentage
配置當 AOF 檔案需要比舊 AOF 檔案增大多少時才進行 AOF 重寫,而auto-aof-rewrite-min-size
則配置當 AOF 檔案需要達到多大體積時才進行 AOF 重寫。只有這兩個配置的條件都達到時,才會進行 AOF 重寫。
AOF 的優點
- AOF 持久化的方法提供了多種的同步頻率,即使使用預設的同步頻率每秒同步一次,Redis 最多也就丟失 1 秒的資料而已。
- AOF 檔案使用 Redis 命令追加的形式來構造,因此,即使 Redis 只能向 AOF 檔案寫入命令的片斷,使用 redis-check-aof 工具也很容易修正 AOF 檔案。
- AOF 檔案的格式可讀性較強,這也為使用者提供了更靈活的處理方式。例如,如果我們不小心錯用了 FLUSHALL 命令,在重寫還沒進行時,我們可以手工將最後的 FLUSHALL 命令去掉,然後再使用 AOF 來恢復資料。
AOF 的缺點
- 對於具有相同資料的的 Redis,AOF 檔案通常會比 RDF 檔案體積更大。
- 雖然 AOF 提供了多種同步的頻率,預設情況下,每秒同步一次的頻率也具有較高的效能。但在 Redis 的負載較高時,RDB 比 AOF 具好更好的效能保證。
- RDB 使用快照的形式來持久化整個 Redis 資料,而 AOF 只是將每次執行的命令追加到 AOF 檔案中,因此從理論上說,RDB 比 AOF 方式更健壯。官方文件也指出,AOF 的確也存在一些 BUG,這些 BUG 在 RDB 沒有存在。
參考資料
相關推薦
Redis AOF 持久化學習筆記
文章 Redis 快照持久化學習筆記 介紹 Redis 快照持久化的功能,除了快照持久化外,Redis 還提供了 AOF(Append Only File)持久化功能。與快照持久化通過直接儲存 Redis 的鍵值對資料不同,AOF 持久化是通過儲存 Redis
redis 安裝配置學習筆記
環境 有時 redis監控 redis主從 net 需要 原因 dir 學習 redis 安裝配置學習筆記 //wget http://download.redis.io/releases/redis-2.8.17.tar.gz 下載最新版本 wget http:/
Redis AOF持久化和RDB持久化區別
redis兩種持久化一、redis持久化----兩種方式1、redis提供了兩種持久化的方式,分別是RDB(Redis DataBase)和AOF(Append Only File)。2、RDB,簡而言之,就是在不同的時間點,將redis存儲的數據生成快照並存儲到磁盤等介質上;3、AOF,則是換了一個角度來實
Redis AOF 持久化
文章 Redis 快照持久化 介紹 Redis 快照持久化的功能,除了快照持久化外,Redis 還提供了 AOF(Append Only File)持久化功能。與快照持久化通過直接儲存 Redis 的鍵值對資料不同,AOF 持久化是通過儲存 Redis 執行的寫命令來記錄 Red
Redis-AOF持久化
Redis持久化-AOF 一. AOF持久化原理 AOF(append only file)持久化是以獨立日誌的方式記錄每次寫命令,重啟時再重新執行AOF檔案中的命令達到恢復資料的目的。AOF主要作用是解決了資料持久化的實時性,目前已經是redis持久化的主流方式。 二.
Swoole 安裝支援非同步Redis客戶端---學習筆記(2)
編譯安裝hiredis hiredis下載地址:https://github.com/redis/hiredis/releases make -j sudo make install
Redis學習筆記——持久化RDB和AOF
RDB(Redis DataBase) 在指定的時間間隔內將記憶體中的資料集快照寫入磁碟,也就是行話講的Snapshot快照,它恢復時是將快照檔案直接讀入到記憶體裡。 Redis會單獨建立(fork)一個子程序來進行持久化,會先將資料寫入到一個臨時檔案中,待持久
Redis深入學習筆記(三)RDB及AOF流程
del 每秒調用 查看 單個 一個 重寫 use 物理內存 深入學習 RDB是Redis持久化數據的一種方式,是執行時間點的Redis內存快照,redis數據還原時加載rdb文件,Redis的主從數據同步也是基於RDB實現的。 RDB流程:
Redis學習筆記(八)——持久化
配置信息 成功 一個 filename 自動啟用 復數 裏的 ont 安全性 一、介紹 Redis的所有的數據都存在內存中,然後不定期的通過異步方式保存到磁盤上(這稱為"半持久化模式");也可以把每一次數據變化都寫入到一個append only file(aof)裏面(
Redis學習筆記(5)—— Redis的持久化方案&Redis的叢集搭建
一、Redis的持久化方案 Redis的高效能是由於其將所有資料都儲存在了記憶體中,為了使Redis在重啟之後仍能保證資料不丟失,需要將資料從記憶體中同步到硬碟中,這一過程就是持久化。 Redis支援兩種方式的持久化,一種是RDB方式,一種是AOF
《Redis設計與實現》閱讀筆記6-AOF持久化
10 AOF(Append Only File) 10.1 AOF是什麼 以日誌的形式來記錄每個寫操作,將Redis執行過的所有寫指令記錄下來(讀操作不記錄), 只許追加檔案但不可以改寫檔案,redis啟動之初會讀取該檔案重新構建資料,換言之
Redis學習六:Redis的持久化-AOF
AOF(Append Only File) 一、是什麼 以日誌的形式來記錄每個寫操作,將Redis執行過的所有寫指令記錄下來(讀操作不記錄),只許追加檔案但不可以改寫檔案,redis啟動之初會讀取該檔案重新構建資料,換言之,redis重啟的話就根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復
7.redis學習筆記-資料庫&RDB持久化.md
8. 資料庫 8.1. 介紹下這個資料庫 Redis伺服器將所有資料庫都儲存在伺服器狀態redis.h/redisServer結構的db陣列中,db陣列的每個項都是一個redis.h/redisDb結構,每個redisDb結構代表一個數據庫: struct r
Redis學習筆記(4)-持久化、主從配置、哨兵、叢集配置
HDIS-Framework是一個基於SpringBoot、Kubernetes、阿里雲服務,編寫的一個用於支撐微服務的極速開發框架。 其文件詳盡,Demo全面,設計合理,開箱即用,節省開發時間,提升開發效率。 配套的docker、Kubernete
(六)、Redis的AOF持久化---Redis設計與實現讀書筆記
redisServer關於AOF的資料結構 /** *Redis 伺服器類 */ struct redisServer{ ... //AOF快取區 sds aof_buf; ... } 當伺服器執行完一個寫命令後,會一協議格
redis學習系列(四)--redis的AOF持久化深入理解各種操作和相關實驗
目錄 1、AOF持久化的配置 AOF持久化預設是關閉的,預設是開啟RDB持久化 appendonly yes,(在redis.conf中修改appendonly 的策略,將no改成yes即可)此配置可以開啟AOF持久化機制,在生產環境裡面,一
Redis學習筆記(二) Redis持久化
Redis的所有資料都是儲存在記憶體中,然後不定期的通過非同步方式儲存到磁碟上(這稱為“半持久化模式”);也可以把每一次資料變化都寫入到一個檔案裡面(這稱為“全持久化模式”)。 這裡主要介紹這兩種持久化方法 RDB方式和 AOF方式 可以單獨的使用其中一種方式,也可以將兩
redis學習筆記七之持久化
redis是一個支援持久化的記憶體資料庫,也就是說redis需要經常將記憶體中的資料同步到磁碟來保證持久化。redis支援兩種持久化方式,一種是 Snapshotting(快照)也是預設方式,另一種是Append-only file(縮寫aof)的方式。下面分別介紹Sn
Redis學習筆記(一)-持久化
snap -m rdb持久化 缺點 tro truncate only ont sync 一、RDB持久方式 RDB持久化是把當前進程的數據已快照的形式保存到硬盤的過程。 觸發方式: 1、手動觸發命令:save和bgsave save:阻塞式,內存較大的實例在執行過程中會造
Redis學習筆記~Twenproxy所起到的作用
out arm mdb ntp ddd pin alq odi mib 回到目錄 Twenproxy除了可以作為redis的代理,它同樣支持memerycached。我這裏主要了解Twemproxy在redis集群上的解決方案。Twemproxy除了完美的解決了分片,路由