有道無術,術尚可求,有術無道,止于術。
本系列Redis 版本 7.2.5
源碼地址:https://gitee.com/pearl-organization/study-redis-demo
文章目錄
- 1. 概述
- 2. 案例演示
- 2.1 無持久化
- 2.2 RDB
- 2.3 AOF
- 2.4 混合模式
- 2.4.1 方式一: 同時開啟
- 2.4.2 方式二: 只開啟 AOF
1. 概述
持久化官方文檔
在前兩篇文檔中,我們學習了RDB
、AOF
的相關知識,它們各有優缺點。在實際應用中,需要根據場景選擇適合的持久化策略。
Redis
支持以下四種方式:
- 無持久化:同時關閉
RDB
、AOF
RDB
:只開啟RDB
AOF
:只開啟AOF
- 混合模式:同時支持
RDB
、AOF
2. 案例演示
2.1 無持久化
適用于以下場景:
- 緩存層:作為數據庫查詢緩存時,如果數據丟失,可以重新獲取并填充到緩存中,持久化不是必需的。
- 實時分析:在實時數據流處理或分析中,
Redis
可能被用作一個中間存儲層,用于聚合、過濾或轉換數據。由于這些數據通常是實時生成的,并且只在一段時間內需要,因此可能不需要持久化。一旦分析完成或數據過期,它們就可以被丟棄。 - 臨時存儲:在某些應用中,
Redis
可能被用作臨時存儲來存儲會話數據、臨時令牌或其他短生命周期的信息。由于這些數據本質上是臨時的,并且在一段時間后會被丟棄或失效,因此可能不需要持久化。
在redis.conf
中同時關閉RDB
、AOF
:
save ""
appendonly no
注意,關閉后是依然可以使用save
、bgsave
、bgrewriteaof
命令生成文件。
默認啟用RDB
,所以在安裝目錄可以看到 dump.rdb
文件:
將 dump.rdb
文件刪除,然后啟動 Redis
,雖然之前存入了數據,但是因為沒有恢復文件,所以數據庫是空:
重新存入數據后,由于禁用了 RDB
,所以不會生成dump.rdb
文件,一旦重新啟,所有數據將會丟失。
2.2 RDB
Redis
默認啟用RDB
持久化,只生成單個二進制文件,比AOF
性能更好,但是可能會存在數據丟失問題。Redis
本身是十分穩定的,適用于對數據一致性要求不是特別高的場景:
- 主從復制:
Redis
主從復制架構中,RD
B被用作數據同步的一種機制。主節點可以生成RDB
文件,然后發送給從節點,用于初次全量復制或連接重建時的快速同步。 - 恢復和備份:
RDB
文件是一個緊湊的二進制文件,可以很方便地進行備份、傳輸和恢復。 - 緩存層:作為數據庫緩存時,如果數據丟失,可以重新獲取并填充到緩存中。
在redis.conf
中開啟RDB
:
# 關閉
# save ""
# 開啟,每隔600秒(10分鐘)檢查一次,如果在這段時間內至少發生了10次寫操作,則執行一次RDB快照保存
save 600 10
存入數據后,關閉Redis
時,會觸發生成RDB
文件。重啟時會重新加載到內存中。執行多次寫入操作,可以看到觸發了保存規則,開啟了子線程進行RDB
生成:
總結:可以接受在災難情況下丟失幾分鐘的數據。
2.3 AOF
AOF
相較于 RDB
其主要缺點就是性能不如 RDB
,適用于數據一致性要求較高的場景。默認情況下是關閉的,需要在redis.conf
中主動開啟:
# 關閉 RDB
save ""
# 開啟AOF
appendonly yes
重啟 Redis
后,在控制臺可以看到創建了AOF
的基礎文件和增量文件:
在 appendonlydir
(默認存儲目錄)下可以看到相關文件:
2.4 混合模式
RDB
、AOF
各有特點,在技術選型時是一個權衡點,其特點對比如下:
RDB | AOF | |
---|---|---|
持久化機制 | 定期保存快照 | 實時命令追加 |
文件大小 | 二進制文件,體積較小 | 文本、二進制文件,體積較大 |
恢復速度 | 原生壓縮數據,速度快 | 寫命令數據,相對較慢 |
容災能力 | 數據可能有丟失 | 數據可能有丟失(最后一條命令或最后一秒) |
使用場景 | 定期備份、大規模數據恢復 | 低/輕量級 |
資源消耗 | 高/重量級 | 數據丟失容忍度低 |
啟動優先級 | 低 | 高 |
在官方文檔中,有提到如果想要獲得與 PostgreSQL
級別的數據安全性,應該同時使用兩種持久化方式。
2.4.1 方式一: 同時開啟
在配置文件中同時開啟RDB
、AOF
持久化:
# 開啟RDB
save 600 10
# 開啟AOF
appendonly yes
當觸發了規則后,會同時生成RDB
、AOF
文件:
同時開啟的條件下,重啟時會優先讀取AOF
文件:
這種方式下,同時維護兩套持久化機制,對性能會造成一定的影響。
2.4.2 方式二: 只開啟 AOF
AOF
本身已經提供了混合持久化機制,在Redis 7.x 系列【16】持久化機制之 AOF中有介紹過一個配置參數:
aof-use-rdb-preamble yes
在 Redis 6
中,開啟此配置后(默認開啟),重寫 的AOF
文件由兩個不同的部分組成:
RDB file
:數據快照AOF tail
:記錄寫操作
在重啟加載過程中,Redis
會識別 AOF
文件以 “REDIS
” 字符串開頭,并加載 RDB
快照數據,然后繼續加載 AOF
相關的內容,以實現更快的重寫和恢復速度。
在 Redis 7
中,開啟此配置后(默認開啟),在 AOF
重寫時,會將當前時刻的數據快照保存為單個的 RDB
文件,后續的寫操作也保存為單獨的 AOF
文件:
在全量備份時,這里的 RDB
文件可以作為恢復文件,無需再單獨執行 BGSAVE
命令,由于是在觸發重寫后才會更新文件,可能會丟失重寫后的數據。