redis 持久化原理與實戰


官網介紹:http://www.redis.io

Redis 提供了2個不同形式的持久化方式。

  1. RDB(Redis DataBase)
  2. AOF(Append Of File)

docker安裝redis

拉取redis鏡像,展示鏡像

docker pull redis:latest
docker images

創建myredis文件夾,在下面創建confdata兩個子文件夾,用於映射docker redis中的redis.confdata文件夾

mkdir -p myredis/{conf,data}
cd myredis/conf
wget http://download.redis.io/redis-stable/redis.conf

修改redis.conf文件,主要修改以下幾個地方

  • bind 將這個注釋掉,保證redis可以遠程訪問
  • requirepass 設置密碼
  • daemonize 這個要注釋掉,不然docker容器起不來
  • appendonly 用於開啟AOFAppend-only file)默認是no,如果想開啟,改成yes即可。

myredis路徑下,運行docker

# home/sdz/myredis
docker run -d \
-p 6379:6379 \
-v $PWD/conf/redis.conf:/etc/redis/redis.conf \
-v $PWD/data:/data --name myredis \
--restart=always \
--privileged=true \
redis redis-server /etc/redis/redis.conf

進入redis客戶端

docker exec -it myredis redis-cli

RDB(Redis DataBase)

定義

在指定的時間間隔內將內存中的數據集快照寫入磁盤, 即Snapshot快照,它恢復時是將快照文件直接讀到內存里。

流程

Redis會單獨創建(fork)一個子進程來進行持久化,會先將數據寫入到 一個臨時文件中,待持久化過程都結束了,再用這個臨時文件替換上次持久化好的文件。 整個過程中,主進程是不進行任何IO操作的,這就確保了極高的性能 如果需要進行大規模數據的恢復,且對於數據恢復的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點是最后一次持久化后的數據可能丟失

image-20220213220512457

實戰

配置

redis.conf中配置文件名稱,默認為dump.rdbrdb文件的保存路徑,也可以修改。默認為Redis啟動時命令行所在的目錄下。docker上面配置了data目錄,會在那里顯示。

dbfilename dump.rdb

image-20220213221821605

image-20220213223038281

配置文件中默認的快照配置

格式:save 秒鍾 寫操作次數

RDB是整個內存的壓縮過的SnapshotRDB的數據結構,可以配置復合的快照觸發條件,

默認是1分鍾內改了1萬次,或5分鍾內改了10次,或15分鍾內改了1次。
推薦:禁用,不設置save指令,或者給save傳入空字符串

image-20220213223739217

命令

savesave時只管保存,其它不管,全部阻塞。手動保存。不建議。

bgsaveRedis會在后台異步進行快照操作,快照同時還可以響應客戶端請求。

可以通過lastsave 命令獲取最后一次成功執行快照的時間

redis.conf 其他相關配置

  • stop-writes-on-bgsave-error:當Redis無法寫入磁盤的話,直接關掉Redis的寫操作。推薦yes

  • rdbcompression 壓縮文件: 對於存儲到磁盤中的快照,可以設置是否進行壓縮存儲。如果是的話,redis會采用LZF算法進行壓縮。如果不想消耗CPU來進行壓縮的話,可以設置為關閉此功能。推薦yes

  • rdbchecksum 檢查完整性:在存儲快照后,還可以讓redis使用CRC64算法來進行數據校驗,

    但是這樣做會增加大約10%的性能消耗,如果希望獲取到最大的性能提升,可以關閉此功能。推薦yes

如何停止

動態停止RDBredis-cli config set save "" save后給空值,表示禁用保存策略

rdb的備份

先通過config get dir 查詢rdb文件的目錄

*.rdb的文件拷貝到別的地方

rdb的恢復

  • 關閉Redis

  • 先把備份的文件拷貝到工作目錄下 cp dump2.rdb dump.rdb

  • 啟動Redis, 備份數據會直接加載

優勢

  • 適合大規模的數據恢復
  • 對數據完整性和一致性要求不高更適合使用
  • 節省磁盤空間
  • 恢復速度快

劣勢

  1. Fork的時候,內存中的數據被克隆了一份,大致2倍的膨脹性需要考慮
  2. 雖然Redisfork時使用了寫時拷貝技術,但是如果數據龐大時還是比較消耗性能。
  3. 在備份周期在一定間隔時間做一次備份,所以如果Redis意外down掉的話,就會丟失最后一次快照后的所有修改。

小結

image-20220213225918366

AOF(Append Only File)

定義

日志的形式來記錄每個寫操作(增量保存),將Redis執行過的所有寫指令記錄下來(讀操作不記錄), 只許追加文件但不可以改寫文件redis啟動之初會讀取該文件重新構建數據,換言之,redis 重啟的話就根據日志文件的內容將寫指令從前到后執行一次以完成數據的恢復工作。

流程

  1. 客戶端的請求寫命令會被append追加到AOF緩沖區內;
  2. AOF緩沖區根據AOF持久化策略[always,everysec,no]將操作sync同步到磁盤的AOF文件中;
  3. AOF文件大小超過重寫策略或手動重寫時,會對AOF文件rewrite重寫,壓縮AOF文件容量;
  4. Redis服務重啟時,會重新load加載AOF文件中的寫操作達到數據恢復的目的;

image-20220211141833860

實戰

AOF默認不開啟,可以在redis.conf中配置文件名稱,默認為 appendonly.aof

AOF文件的保存路徑,同RDB的路徑一致。

注意:AOFRDB同時開啟,系統默認取AOF的數據(數據不會存在丟失)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM