Redis---數據持久化之RDB與AOF

来源:https://www.cnblogs.com/sre-chan/archive/2023/04/17/17327258.html
-Advertisement-
Play Games

一、數據持久化之RDB 1、RDB介紹 Redis 資料庫文件,全稱 Redis DataBase,數據持久化方式之一,數據持久化預設方式,按照指定時間間隔,將記憶體中的數據及快照寫入硬碟 定義RDB文件名 dbfilename "dump.rdb" RDB指dump.rdb文件; redis數據每次 ...


一、數據持久化之RDB

1、RDB介紹

Redis 資料庫文件,全稱 Redis DataBase,數據持久化方式之一,數據持久化預設方式,按照指定時間間隔,將記憶體中的數據及快照寫入硬碟
定義RDB文件名
dbfilename "dump.rdb"

RDB指dump.rdb文件; redis數據每次存檔,如果不指定持久化的方式,數據就會預設存入dump.rdb文件中

2、相關配置

數據從記憶體保存到硬碟的頻率

save   900      1           # 900秒 (15分鐘) 且有1個key改變即存檔
save   300     10           # 300秒 (5分鐘) 且有10個key改變即存檔
save    60     10000        # 60秒 (1分鐘) 且有10000個key改變即存檔

手動存檔

save                    # 阻塞寫存檔
bgsave                  # 不阻塞寫存檔

阻塞寫存檔:即當記憶體中有1G大小的數據,執行了save命令,要寫入硬碟,這個過程需要1分鐘,則在這一分鐘的時間內,不允許向記憶體中存入數據

不阻塞寫存檔:即當記憶體中有1G大小的數據,執行了bgsave命令,要寫入硬碟,這個過程需要1分鐘,則在這一分鐘的時間內,是允許向記憶體中繼續存入數據的

save 將記憶體中的數據寫入到硬碟

# 刪除原有的持久化文件
[root@template ~]# rm  /var/lib/redis/6379/* 
[root@template redis-4.0.8]# redis-cli
127.0.0.1:6379> ping
PONG
# 添加數據
127.0.0.1:6379> mset v1 2 v2 4 v3 xx v4 66
OK
# 將記憶體中的數據馬上寫入到硬碟中(自動存檔的規則,需要滿足條件)
127.0.0.1:6379> SAVE
OK		
127.0.0.1:6379> exit
# 採用預設持久化方式,數據存到dump.rdb中
[root@template ~]# ll /var/lib/redis/6379/
total 4
-rw-r--r--. 1 root root 231 Apr 17 20:02 dump.rd

重啟redis服務以後,數據依然存在

[root@template redis-4.0.8]# redis-cli shutdown
[root@template redis-4.0.8]# ps -ef | grep redis.conf
root     121839   1221  0 20:05 pts/0    00:00:00 grep --color=auto redis.conf

重新開啟redis服務

[root@template redis-4.0.8]# /etc/init.d/redis_6379 start
Starting Redis server...

查看當前庫下所有的數據,依然存在,數據永久存儲

[root@template redis-4.0.8]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> KEYS *
1) "site"
2) "student"
3) "v1"
4) "v4"
5) "v2"
6) "v3"

3、 數據備份與恢復

備份數據:備份dump.rdb 文件到其他位置

恢複數據:拷貝備份文件到資料庫目錄,啟動 redis 服務

redis伺服器數據備份,備份dump.rdb文件,到/opt目錄下

[root@template ~]# cp /var/lib/redis/6379/dump.rdb /opt/

將備份的數據拷貝給template,讓template擁有相同的數據

[root@template~]# scp /opt/dump.rdb  [email protected]:/root/

進行redis的數據恢復,停止redis服務

[root@template~]# /etc/init.d/redis_6379 stop

# 刪除template,redis持久化數據文件
[root@template~]# rm -rf /var/lib/redis/6379/dump.rdb 	

# 將從template主機備份的文件,拷貝到redis的數據目錄下
[root@template~]# cp /root/dump.rdb  /var/lib/redis/6379/	

# 重啟服務,會重新載入dump.rdb
[root@template~]# /etc/init.d/redis_6379 start		
[root@template~]# redis-cli
127.0.0.1:6379> keys *
127.0.0.1:6379> exit 

4、驗證redis自動存檔

實驗環境準備,停止redis服務

[root@template~]# redis-cli -h 192.168.11.10 -p 6350 -a 123456 shutdown

進入到redis預設路徑下,刪除rdb數據文件

[root@template~]# cd /var/lib/redis/6379/
[root@template~]# rm -rf dump.rdb 

配置文件中修改存檔時間

[root@template ~]# vim /etc/redis/6379.conf
 .......
219 save 900 1		#900秒 (15分鐘) 且有1個key改變即存檔,不修改
220 save 120 10		#120秒 (2分鐘) 且有10個key改變即存檔, 修改修改修改!!!!!
221 save 60 10000	#60秒(1分鐘)且有10000個key改變即存檔,不修改

啟動redis服務

[root@template ~]# /etc/init.d/redis_6379 start

連接redis,存入變數

[root@template ~]# redis-cli

向reids中連續存入10個以上的變數

127.0.0.1:6379> mset v1 1 v2 1 v3 1 v4 1 v5 1 v6 1 v8 1 v9 1 v10 1 v11 1
127.0.0.1:6379> keys *
127.0.0.1:6379> exit

在redis的數據目錄下,兩分鐘dump.rdb出現,驗證redis自動持久化成功

[root@template ~]# ls /var/lib/redis/6379

5、優點與缺點

RDB優點:

高性能的持久化實現 ——》 創建一個子進程來執行持久化,先將數據寫入臨時文件,持久化過程結束後,再用這個臨時文件替換上次持久化好的文件;過程中主進程不做任何IO操作
1》持久化的效率高,因為是由一個單獨的子進程來負責將記憶體中的數據寫入到硬碟;
2》持久化過程:將當前進程中的數據生成快照文件,替換上次的持久化文件

PS:進程中的數據,指redis的所有數據,比較適合大規模數據恢復,且對數據完整性要求不是非常高的場合

恢複數據簡單,拷貝備份數據,重啟服務即可,因為RDB方式,有可能會丟失最後一次的持久化數據,使用時需要對數據完整性要求不高

RDB的缺點:

意外宕機時,丟失最後一次持久化的所有數據
1》redis 是每隔900秒(15分鐘),或者300秒(5分鐘),或者一分鐘變數改變10000次,會進行一次持久化(將記憶體數據寫入到硬碟);
2》如果在還沒有到達臨界點時(例如:一分鐘變數改變 9999次),硬碟損壞,會導致這9999次的數據丟失。

二、數據持久化之AOF

1、AOF介紹

Append Only File
追加方式記錄寫操作的文件,記錄 redis 服務所有寫操作,不斷的將新的寫操作,追加到文件的末尾,預設沒有啟用,使用cat命令可以查看文件內容

2、開啟AOF持久化功能,在template 上操作

[root@template ~]# redis-cli
127.0.0.1:6379> keys *
127.0.0.1:6379> config set appendonly yes		#開啟AOF持久化功能
127.0.0.1:6379> config rewrite				#將臨時配置寫到配置文件中
127.0.0.1:6379> exit
[root@template ~]# ls /var/lib/redis/6379/
appendonly.aof  dump.rdb

3、查看AOF相關配置,在template上操作

[root@template ~]# vim /etc/redis/6379.conf 
673:appendonly yes					# aof持久化已經啟用
677:appendfilename "appendonly.aof"		# aof持久化存放數據的文件名

4、AOF文件記錄寫操作的方式

[root@template ~]# vim /etc/redis/6379.conf 
702 # appendfsync always		#always 在redis中每進行一次寫操作, 都會將記錄存入appendonly.aof中,並將數據持久化到 dump.rdb文件中
 
703 appendfsync everysec		#everysec 將寫操作記錄到appendonly.aof中,每秒執行一次,並將數據持久化到 dump.rdb文件中
 
704 # appendfsync no			# no  只把寫操作記錄到appendonly.aof中,不會進行RDB持久化(節省系統資源)

5、備份與恢復

備份數據:備份 appendonly.aof 文件到其他位置

redis伺服器數據備份,在template 上操作

[root@template ~]# cp /var/lib/redis/6379/appendonly.aof  /opt/

將備份的aof數據文件拷貝給node01,讓node01擁有相同的數據

[root@template ~]# scp /opt/appendonly.aof  [email protected]:/root/

恢複數據:拷貝備份文件到資料庫目錄,啟動 redis 服務

[root@node01~]# /etc/init.d/redis_6379 stop
[root@node01~]# rm -rf /var/lib/redis/6379/dump.rdb
[root@node01~]# cp appendonly.aof  /var/lib/redis/6379/

開啟本機的AOF持久化功能

[root@node01~]# vim /etc/redis/6379.conf
673 appendonly yes		#no 修改為yes,啟動AOF功能
[root@node01~]# /etc/init.d/redis_6379 start
[root@node01~]# redis-cli
127.0.0.1:6379> keys *
127.0.0.1:6379> exit 

6、優化配置

日誌文件會不斷增大,何時觸發日誌重寫?

auto-aof-rewrite-min-size    64mb          //首次重寫觸發值
auto-aof-rewrite-percentage   100          //到達增長百分比,再次執行重寫

查看redis的日誌優化配置,在template上操作

#當日誌的數據第一次達到64mb時,會觸發重寫,重寫後文件大小為50Mb
#繼續嚮日志中存入數據,日誌大小為100Mb時,會觸發重寫,重寫後文件大小為80Mb
#繼續嚮日志中存入數據,日誌大小為160Mb時,會觸發重寫,重寫後文件大小為140Mb
#繼續嚮日志中存入數據,日誌大小為280Mb時,會觸發重寫,重寫後文件大小為260Mb
[root@template~]# vim /etc/redis/6379.conf
 744 auto-aof-rewrite-percentage 100
 745 auto-aof-rewrite-min-size 64mb

7、AOF優點與缺點

AOF優點

可以靈活設置持久化方式,出現意外宕機時,僅可能丟失1秒的數據

AOF缺點

持久化文件的體積通常會大於 RDB 方式,執行 fsync 策略時的速度可能會比 RDB 方式慢,驗證AOF存儲數據占用更多空間,在template上操作,統計appendonly.aof的行數

[root@node01 6379]# wc -l appendonly.aof 
82 appendonly.aof
[root@node01 6379]# redis-cli 
127.0.0.1:6379> set test 22
127.0.0.1:6379> exit   #斷開redis連接
[root@node01 6379]# wc -l appendonly.aof 		#再次統計appendonly.aof的行數
94 appendonly.aof

8、生產環境的使用:

RDB和AOF持久化 需要同時開啟,RDB做持久化,AOF記錄redis執行命令

作者:ChAn 出處:http://www.cnblogs.com/sre-chan/

-------------------------------------------

個性簽名:今天做了別人不想做的事,明天你就做得到別人做不到的事,嘗試你都不敢,你拿什麼贏!

如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,博主在此感謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • .NET 實現JWT登錄認證 在ASP.NET Core應用程式中,使用JWT進行身份驗證和授權已成為一種流行的方式。JWT是一種安全的方式,用於在客戶端和伺服器之間傳輸用戶信息。 添加NuGet包 首先,我們需要添加一些NuGet包來支持JWT身份驗證。在您的ASP.NET Core項目中,打開S ...
  • 眾所周知,bash命令執行的時候會輸出信息,但有時這些信息必須要經過幾次處理之後才能得到我們想要的格式,此時應該如何處置?這就牽涉到 管道命令(pipe) 了。管道命令使用的是|這個界定符號。每個管道後面接的第一個數據必定是命令,而且這個命令必須要能夠接受標準輸出的數據才行,這樣的命令才可為管道命令... ...
  • 考點:文件的打開和讀取 打開文件的過程: 打開操作本質上是使用了open這個系統調用,參數如下圖所示。 操作系統通過文件的路徑在外存中找到了這個test.txt文件所在的目錄,繼續找該文件的目錄項(FCB),一個文件只有一個目錄項。然後將這個目錄項調到記憶體中,系統中有一個系統打開文件表,裡面存放的是 ...
  • 資源管理器右鍵添加打開cmd視窗指令 資源管理器空白處右鍵添加打開cmd視窗命令,直接打開cmd並切換到當前目錄 首先刪除該指令 添加該指令條目、名稱,然後添加具體的指令 此.reg文件必須以UTF-8-BOM編碼格式保存,否則無法設置中文名稱 Windows Registry Editor Ver ...
  • linux vi命令詳解 剛開始學著用linux,對vi命令不是很熟,在網上轉接了一篇。 vi編輯器是所有Unix及Linux系統下標準的編輯器,它的強大不遜色於任何最新的文本編輯器,這裡只是簡單地介紹一下它的用法和一小部分指 令。由於 對Unix及Linux系統的任何版本,vi編輯器是完全相同的, ...
  • GMT 和 UTC 時間有何區別?Unix 時間常式為何不處理閏秒?系統時區是如何設置的?哪些時間常式受夏時制影響?localtime 和 gmtime 是否共用內部存儲區?strftime 獲取第幾周使用的 %U/%V/%W 有何區別?linux date 和 mac date 語法有何區別?本文... ...
  • Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢出) ”問題如下: 一、報錯信息: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢出),如圖: 格式化後的報錯信息: { "timestamp": "2023-04-17 22: ...
  • **鎖屏面試題百日百刷,每個工作日堅持更新面試題。**請看到最後就能獲取你想要的, 接下來的是今日的面試題: 1.為什麼kafka可以實現高吞吐?單節點kafka的吞吐量也比其他消息隊列大,為什麼? Kafka是分散式消息系統,需要處理海量的消息,Kafka的設計是把所有的消息都寫入速度低容量大的硬 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...