目錄
1.持久化的幾種方式
2.RDB簡介
3.持久化觸發
1)手動觸發
① save 指令
② bgsave 指令
2)自動觸發
① save m n
② flushall
③ 主從同步觸發
4.配置說明
5.設定查詢
6.配置設定
7.RDB 檔案復原
8.RDB 優缺點
1)RDB 優點
2)RDB 缺點
9.停用持久化
10.小結
11.思考題
12.參考&鳴謝
首頁 資料庫 Redis 深入了解 Redis持久化 中的 快照方式(RDB)

深入了解 Redis持久化 中的 快照方式(RDB)

Mar 31, 2020 am 10:23 AM
redis

這篇文章帶大家了解Redis持久化中的 快照方式(RDB)。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

深入了解 Redis持久化 中的 快照方式(RDB)

Redis 的讀寫都是在記憶體中,所以它的效能較高,但在記憶體中的資料會隨著伺服器的重啟而遺失,為了確保數據不遺失,我們需要將記憶體中的資料儲存到磁碟,以便Redis 重新啟動時能夠從磁碟中恢復原有的數據,而整個過程就叫做Redis 持久化。

深入了解 Redis持久化 中的 快照方式(RDB)
Redis 持久化也是 Redis 和 Memcached 的主要差異之一,因為 Memcached 是不具備持久化功能的。

1.持久化的幾種方式

Redis 持久化有以下三種方式:

  • 快照方式(RDB, Redis DataBase)將某一個時刻的記憶體數據,以二進位的方式寫入磁碟;
  • 檔案追加方式(AOF, Append Only File),記錄所有的操作指令,並以文本的形式追加到文件中;
  • 混合持久化方式,Redis 4.0 之後新增的方式,混合持久化是結合了RDB 和AOF 的優點,在寫入的時候,先把目前的資料以RDB 的形式寫入文件的開頭,再將後續的操作指令以AOF 的格式存入文件,這樣既能確保 Redis 重啟時的速度,又能簡單資料遺失的風險。

因為每個持久化方案,都有特定的使用場景,讓我們先從 RDB 持久化說起。

2.RDB簡介

RDB(Redis DataBase)是將某個時刻的記憶體快照(Snapshot),以二進位的方式寫入磁碟的過程。

3.持久化觸發

RDB 的持久化觸發方式有兩類:一類是手動觸發,另一類是自動觸發。

1)手動觸發

手動觸發持久化的操作有兩個:save 和bgsave ,它們主要差異體現在:是否阻塞Redis 主執行緒的執行。

① save 指令

在客戶端執行save 指令,就會觸發Redis 的持久化,但同時也是讓Redis 處於阻斷狀態,直到RDB 持久化完成,才會回應其他客戶端發出的命令,所以在生產環境一定要慎用

save 指令使用如下:

深入了解 Redis持久化 中的 快照方式(RDB)

#從圖片可以看出,當執行完 save 指令之後,持久化檔案dump.rdb 的修改時間就改變了,這表示save 成功的觸發了 RDB 持久化。

save 指令執行流程,如下圖所示:

深入了解 Redis持久化 中的 快照方式(RDB)

② bgsave 指令

bgsave(background save )既後台保存的意思, 它和save 指令最大的差別就是bgsave 會fork() 一個子程序來執行持久化,整個過程中只有在fork() 子程序時有短暫的阻塞,當子程序被創建之後,Redis 的主程序就可以回應其他客戶端的請求了,相對於整個流程都阻塞的 save 指令來說,顯然 bgsave 指令更適合我們使用。
bgsave 指令使用,如下圖所示:

深入了解 Redis持久化 中的 快照方式(RDB)

#bgsave 執行流程,如下圖所示:

深入了解 Redis持久化 中的 快照方式(RDB)

2)自動觸發

說完了 RDB 的手動觸發方式,以下來看如何自動觸發 RDB 持久化?
RDB 自動持久化主要來自下列幾種情況。

① save m n

save m n 是指在 m 秒內,如果有 n 個鍵發生改變,則自動觸發持久化。
參數 m 和 n 可以在 Redis 的檔案中找到,例如,save 60 1 則表示在 60 秒內,至少有一個鍵發生改變,就會觸發 RDB 持久化。
自動觸發持久化,本質是 Redis 透過判斷,如果滿足設定的觸發條件,自動執行一次 bgsave 指令。
注意:當設定多個 save m n 指令時,滿足任一個條件都會觸發持久化。
例如,我們設定了以下兩個 save m n 指令:

  • save 60 10
  • save 600 1

當60s 內如果有10 次Redis 鍵值發生改變,就會觸發持久化;如果60s 內Redis的鍵值改變次數少於10 次,那麼Redis 就會判斷600s 內,Redis 的鍵值是否至少被修改了一次,如果滿足則會觸發持久化。

② flushall

flushall 指令用於清除Redis 資料庫,在生產環境下一定慎用,當Redis 執行了flushall 指令之後,則會觸發自動持久化,把 RDB 檔案清空。
執行結果如下圖所示:

深入了解 Redis持久化 中的 快照方式(RDB)

③ 主從同步觸發

在Redis 主從複製中,當從節點執行全量複製操作時,主節點會執行bgsave 指令,並將RDB 檔案傳送給從節點,該程序會自動觸發Redis 持久化。

4.配置說明

合理的設定 RDB 的配置,可以保障 Redis 高效且穩定的運行,下面一起來看 RDB 的配置項目都有哪些?

RDB 設定參數可以在  Redis 的設定檔中找見,具體內容如下:

# RDB 保存的条件
save 900 1
save 300 10
save 60 10000

# bgsave 失败之后,是否停止持久化数据到磁盘,yes 表示停止持久化,no 表示忽略错误继续写文件。
stop-writes-on-bgsave-error yes

# RDB 文件压缩
rdbcompression yes

# 写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。
rdbchecksum yes

# RDB 文件名
dbfilename dump.rdb

# RDB 文件目录
dir ./
登入後複製

其中比較重要的參數如下清單:
① save 參數
它是用來設定觸發RDB 持久化條件的參數,滿足儲存條件時會將資料持久化到硬碟。
預設設定說明如下:

  • save 900 1:表示900 秒內如果至少有1 個key 值變化,則把資料持久化到硬碟;
  • save 300 10:表示300 秒內如果至少有10 個key 值變化,則把資料持久化到硬碟;
  • save 60 10000:表示60 秒內如果至少有10000 個key 值變化,則把資料持久化到硬碟。

② rdbcompression 參數
它的預設值是 yes 表示開啟 RDB 檔案壓縮,Redis 會採用 LZF 演算法進行壓縮。如果不想消耗 CPU 效能來進行檔案壓縮的話,可以設定為關閉此功能,這樣的缺點是需要更多的磁碟空間來儲存檔案。
③ rdbchecksum 參數
它的預設值為yes 表示寫入檔案和讀取檔案時是否開啟RDB 檔案檢查,檢查是否有無損壞,如果在啟動是檢查發現損壞,則停止啟動。

5.設定查詢

Redis 中可以使用指令查詢目前設定參數。查詢指令的格式為:config get xxx ,例如,想要取得RDB 檔案的儲存名稱設置,可以使用config get dbfilename ,執行效果如下圖所示:

深入了解 Redis持久化 中的 快照方式(RDB)

查詢RDB 的檔案目錄,可用指令config get dir ,執行效果如下圖:

深入了解 Redis持久化 中的 快照方式(RDB)

6.配置設定

設定RDB 的配置,可以透過以下兩種方式:

  • 手動修改Redis 設定檔;
  • 使用命令列設置,例如,使用 config set dir "/usr/data" 就是用來修改RDB 的儲存目錄。

注意:手動修改Redis 設定檔的方式是全域生效的,也就是重啟 Redis 伺服器設定參數也不會遺失,而使用指令修改的方式,在Redis 重啟之後就會失去。但手動修改 Redis 設定文件,想要立即生效需要重啟 Redis 伺服器,而命令的方式則不需要重新啟動 Redis 伺服器。

小貼士:Redis 的設定檔位於 Redis 安裝目錄的根路徑下,預設名稱為 redis.conf。

7.RDB 檔案復原

當 Redis 伺服器啟動時,若 Redis 根目錄存在 RDB 檔案 dump.rdb,Redis 就會自動載入 RDB 檔案復原持久化資料。
如果根目錄沒有 dump.rdb 文件,請先將 dump.rdb 文件移到 Redis 的根目錄。
驗證 RDB 檔案是否已載入
Redis 在啟動時有日誌訊息,會顯示是否載入了 RDB 文件,我們執行Redis 啟動指令:src/redis-server redis. conf ,如下圖:

深入了解 Redis持久化 中的 快照方式(RDB)

#從日誌可以看出, Redis 服務在啟動時已經正常載入了RDB 檔案。

小貼士:Redis 伺服器在載入 RDB 檔案期間,會一直處於阻塞狀態,直到載入工作完成為止。

8.RDB 優缺點

1)RDB 優點

  • RDB 的內容為二進位的數據,佔用記憶體更小,更緊湊,更適合做為備份文件;
  • RDB 對災難復原非常有用,它是一個緊湊的文件,可以更快的傳輸到遠端伺服器進行Redis 服務恢復;
  • RDB 可以更大程度的提高Redis的運行速度,因為每次持久化時Redis 主進程都會fork() 一個子進程,進行資料持久化到磁碟,Redis 主進程並不會執行磁碟I/O 等操作;
  • 與AOF格式的檔案相比,RDB 檔案可以更快的重新啟動。

2)RDB 缺點

  • 因為RDB 只能保存某個時間間隔的數據,如果中途Redis 服務被意外終止了,則會丟失一段時間內的Redis 資料;
  • RDB 需要經常fork() 才能使用子程序將其持久化在磁碟上。如果資料集很大,fork() 可能很耗時,並且如果資料集很大且 CPU 效能不佳,則可能導致 Redis 停止為客戶服務幾毫秒甚至一秒鐘。

9.停用持久化

禁用持久化可以提高Redis 的執行效率,如果對資料遺失不敏感的情況下,可以在連接客戶端的情況下,執行config set save "" 指令即可停用Redis 的持久化,如下圖所示:
深入了解 Redis持久化 中的 快照方式(RDB)

10.小結

透過本文我們可以得知,RDB 持久化分為手動觸發和自動觸發兩種方式,它的優點是儲存檔案小,Redis 啟動時恢復資料比較快,缺點是有遺失資料的風險。 RDB 檔案的復原也很簡單,只要把 RDB 檔案放到 Redis 的根目錄,在 Redis 啟動時就會自動載入並復原資料。

11.思考題

如果 Redis 伺服器 CPU 佔用量過高,可能是什麼原因造成的?歡迎各位在留言區,寫下你們的答案。

12.參考&鳴謝

https://redis.io/topics/persistence
https://blog.csdn.net/ qq_36318234/article/details/79994133
https://www.cnblogs.com/ysocean/p/9114268.html
https://www.cnblogs. com/wdliu/p/9377278.html

本文轉載自:https://segmentfault.com/a/1190000021036574

更多redis知識請關注redis入門教程欄位。

以上是深入了解 Redis持久化 中的 快照方式(RDB)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

redis數據怎麼清空 redis數據怎麼清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

redis指令怎麼用 redis指令怎麼用 Apr 10, 2025 pm 08:45 PM

使用 Redis 指令需要以下步驟:打開 Redis 客戶端。輸入指令(動詞 鍵 值)。提供所需參數(因指令而異)。按 Enter 執行指令。 Redis 返迴響應,指示操作結果(通常為 OK 或 -ERR)。

centos redis如何配置Lua腳本執行時間 centos redis如何配置Lua腳本執行時間 Apr 14, 2025 pm 02:12 PM

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

redis怎麼使用鎖 redis怎麼使用鎖 Apr 10, 2025 pm 08:39 PM

使用Redis進行鎖操作需要通過SETNX命令獲取鎖,然後使用EXPIRE命令設置過期時間。具體步驟為:(1) 使用SETNX命令嘗試設置一個鍵值對;(2) 使用EXPIRE命令為鎖設置過期時間;(3) 當不再需要鎖時,使用DEL命令刪除該鎖。

redis命令行怎麼用 redis命令行怎麼用 Apr 10, 2025 pm 10:18 PM

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

redis過期策略怎麼設置 redis過期策略怎麼設置 Apr 10, 2025 pm 10:03 PM

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。

See all articles