這篇文章帶大家了解一下redis中的兩種持久化機制(RDB和AOP),希望對大家有幫助!
redis是一個記憶體資料庫,資料保存在記憶體中,但是我們都知道記憶體的資料變化是很快的,也容易發生遺失。幸好Redis也為我們提供了持久化的機制,分別是RDB(Redis DataBase)和AOF(Append Only File)。 【相關推薦:Redis影片教學】
在這裡假設你已經了解了redis的基礎文法,某字母網站都有很好的教學課程,可以去看。基本使用的文章就不寫了,都是一些常用的指令。
下面針對這兩種方式來介紹一下。由淺入深。
一、持久化流程
既然redis的資料可以儲存在磁碟上,那麼這個流程是什麼樣的呢?
要有下面五個過程:
(1)客戶端向服務端發送寫入操作(資料在客戶端的記憶體中)。
(2)資料庫服務端接收到寫入請求的資料(資料在服務端的記憶體中)。
(3)服務端調用write這個系統調用,將資料往磁碟上寫(資料在系統記憶體的緩衝區中)。
(4)作業系統將緩衝區中的資料轉移到磁碟控制器上(資料在磁碟快取中)。
(5)磁碟控制器將資料寫到磁碟的實體媒體中(資料真正落到磁碟上)。
這5個過程是在理想條件下一個正常的保存流程,但是在大多數情況下,我們的機器等等都會有各種各樣的故障,這裡劃分了兩種情況:
(1)Redis資料庫發生故障,只要在上面的第三步執行完畢,那麼就可以持久化保存,剩下的兩步由作業系統替我們完成。
(2)作業系統發生故障,必須上面5步驟都完成才可以。
在這裡只考慮了保存的過程可能發生的故障,其實保存的資料也有可能發生損壞,需要一定的恢復機制,不過在這裡就不再延伸了。現在主要考慮的是redis如何來實現上面5個保存磁碟的步驟。它提供了兩種策略機制,也就是RDB和AOF。
二、RDB機制
RDB其實就是把資料以快照的形式保存在磁碟上。什麼是快照呢,你可以理解成把當下時刻的資料拍成一張照片保存下來。
RDB持久化是指在指定的時間間隔內將記憶體中的資料集快照寫入磁碟。也是預設的持久化方式,這種方式是就是將記憶體中資料以快照的方式寫入到二進位檔案中,預設的檔案名稱為dump.rdb。
在我們安裝了redis之後,所有的設定都是在redis.conf檔中,裡面保存了RDB和AOF兩種持久化機制的各種設定。
既然RDB機制是透過把某個時刻的所有資料產生一個快照來保存,那麼就應該有一個觸發機制,就是實現這個過程。對RDB來說,提供了三種機制:save、bgsave、自動化。我們分別來看
1、save觸發方式
#該指令會阻塞目前Redis伺服器,執行save指令期間,Redis無法處理其他指令,直到RDB過程完成為止。具體流程如下:
執行完成時候如果存在舊的RDB文件,就把新的替換掉舊的。我們的客戶端可能都是幾萬或幾十萬,這種方式顯然不可取。
2、bgsave觸發方式
執行該指令時,Redis會在背景非同步進行快照操作,快照同時也能回應客戶端請求。具體流程如下:
具體操作是Redis進程執行fork操作建立子進程,RDB持久化過程由子進程負責,完成後自動結束。阻塞只發生在fork階段,一般時間很短。基本上 Redis 內部所有的RDB操作都是採用 bgsave 指令。
3、自動觸發
自動觸發是由我們的設定檔來完成的。在redis.conf設定檔中,裡面有以下配置,我們可以去設定:
①save:這裡是用來設定觸發Redis的RDB 持久化條件,也就是何時將記憶體中的資料儲存到硬碟.如“save m n”。表示m秒內資料集存在n次修改時,自動觸發bgsave。
預設如下配置:
#表示900 秒內如果至少有1 個key 的值變化,則保存save 900 1#表示300 秒內如果至少有10 個key 的值變化,則保存save 300 10#表示60 秒內如果至少有10000 個key 的值變化,則儲存save 60 10000
不需要持久化,那麼你可以註解掉所有的save 行來停用儲存功能。
②stop-writes-on-bgsave-error :預設值為yes。當啟用了RDB且最後一次後台儲存資料失敗,Redis是否停止接收資料。這會讓使用者意識到資料沒有正確持久化到磁碟上,否則沒有人會注意到災難(disaster)發生了。如果Redis重啟了,那麼又可以重新開始接收資料了
③rdbcompression ;預設值是yes。對於儲存到磁碟中的快照,可以設定是否進行壓縮儲存。
④rdbchecksum :預設值是yes。在儲存快照後,我們也可以讓redis使用CRC64演算法來進行資料校驗,但是這樣做會增加大約10%的效能消耗,如果希望取得最大的效能提升,可以關閉此功能。
⑤dbfilename :設定快照的檔案名,預設是 dump.rdb
⑥dir:設定快照檔案的存放路徑,這個設定項一定是目錄,而不能是檔案名稱。
我們可以修改這些配置來實現我們想要的效果。因為第三種方式是配置的,所以我們對前兩種做一個比較:
4、RDB 的優點和缺點
①、優勢
(1)RDB檔案緊湊,全量備份,非常適合用於進行備份和災難復原。
(2)產生RDB檔案的時候,redis主程序會fork()一個子程序來處理所有保存工作,主程序不需要進行任何磁碟IO操作。
(3)RDB 在恢復大資料集時的速度比 AOF 的復原速度還要快。
②、劣勢
RDB快照是一次全量備份,儲存的是記憶體資料的二元序列化形式,儲存上非常緊湊。當進行快照持久化時,會開啟一個子進程專門負責快照持久化,子進程會擁有父進程的內存數據,父進程修改內存子進程不會反應出來,所以在快照持久化期間修改的數據不會被保存,可能丟失資料。
三、AOF機制
全量備份總是耗時的,有時候我們提供更有效率的方式AOF,工作機制很簡單,redis會將每一個收到的寫入指令都透過write函數追加到檔案中。通俗的理解就是日誌記錄。
1、持久化原理
他的原理看下面這張圖:
每當有一個寫指令過來時,就直接保存在我們的AOF檔中。
2、檔案重寫原則
AOF的方式也同時帶來了另一個問題。持久化文件會變的越來越大。為了壓縮aof的持久化檔。 redis提供了bgrewriteaof指令。將記憶體中的資料以指令的方式儲存到暫存檔案中,同時會fork出一條新進程來將檔案重寫。
重寫aof文件的操作,並沒有讀取舊的aof文件,而是將整個記憶體中的資料庫內容用命令的方式重寫了一個新的aof文件,這點和快照有點類似。
3、AOF也有三種觸發機制
(1)每修改同步always:同步持久化每次發生資料變更會被立即記錄到磁碟效能較差但資料完整性比較好
(2)每秒同步everysec:非同步操作,每秒記錄如果一秒內宕機,有資料遺失
( 3)不同no:從不同步
4、優點
(1)AOF可以更好的保護資料不遺失,一般AOF會每隔1秒,透過一個後台執行緒執行一次fsync操作,最多遺失1秒鐘的資料。 (2)AOF日誌檔案沒有任何磁碟尋址的開銷,寫入效能非常高,檔案不容易破損。
(3)AOF日誌檔案即使過大的時候,出現後台重寫操作,也不會影響客戶端的讀寫。
(4)AOF日誌檔案的命令透過非常可讀的方式進行記錄,這個特性非常適合做災難性的誤刪除的緊急復原。例如某人不小心用flushall指令清空了所有數據,只要這個時候後台rewrite還沒發生,那麼就可以立即拷貝AOF文件,將最後一條flushall指令給刪了,然後再將該AOF文件放回去,就可以透過恢復機制,自動恢復所有資料
5、缺點
#(1)對於同一份資料來說,AOF日誌檔案通常比RDB資料快照檔案更大
(2)AOF開啟後,支援的寫入QPS會比RDB支援的寫入QPS低,因為AOF一般會配置成每秒fsync一次日誌文件,當然,每秒一次fsync,性能也還是很高的
(3)以前AOF發生過bug,就是透過AOF記錄的日誌,進行數據恢復的時候,沒有恢復一模一樣的資料出來。
四、RDB和AOF到底該如何選擇
選擇的話,兩者加一起才會更好。因為兩個持久化機制你明白了,剩下的就是看自己的需求了,需求不同選擇的也不一定,但是通常都是結合使用。有一張圖可供總結:
比較了這幾個特性,剩下的就是看自己了。
更多程式相關知識,請造訪:程式設計影片! !
以上是一文了解redis中RDB和AOP持久化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Redis是一個強大的數據庫解決方案,因為它提供了極速性能、豐富的數據結構、高可用性和擴展性、持久化能力以及廣泛的生態系統支持。 1)極速性能:Redis的數據存儲在內存中,讀寫速度極快,適合高並發和低延遲應用。 2)豐富的數據結構:支持多種數據類型,如列表、集合等,適用於多種場景。 3)高可用性和擴展性:支持主從復制和集群模式,實現高可用性和水平擴展。 4)持久化和數據安全:通過RDB和AOF兩種方式實現數據持久化,確保數據的完整性和可靠性。 5)廣泛的生態系統和社區支持:擁有龐大的生態系統和活躍社區,

Redis的關鍵特性包括速度、靈活性和豐富的數據結構支持。 1)速度:Redis作為內存數據庫,讀寫操作幾乎瞬時,適用於緩存和會話管理。 2)靈活性:支持多種數據結構,如字符串、列表、集合等,適用於復雜數據處理。 3)數據結構支持:提供字符串、列表、集合、哈希表等,適合不同業務需求。

Redis的核心功能是高性能的內存數據存儲和處理系統。 1)高速數據訪問:Redis將數據存儲在內存中,提供微秒級別的讀寫速度。 2)豐富的數據結構:支持字符串、列表、集合等,適應多種應用場景。 3)持久化:通過RDB和AOF方式將數據持久化到磁盤。 4)發布訂閱:可用於消息隊列或實時通信系統。

Redis支持多種數據結構,具體包括:1.字符串(String),適合存儲單一值數據;2.列表(List),適用於隊列和棧;3.集合(Set),用於存儲不重複數據;4.有序集合(SortedSet),適用於排行榜和優先級隊列;5.哈希表(Hash),適合存儲對像或結構化數據。

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。