Redis持久化之RDB和AOF

Redis持久化之RDB和AOF

  • Redis 有兩種持久化方案,RDB (Redis DataBase)和 AOF (Append Only File);

RDB 詳解

  • RDB 是 Redis 默認的持久化方案。在指定的時間間隔內,執行指定次數的寫操作,則會將內存中的數據寫入到磁盤中。即在指定目錄下生成一個dump.rdb文件。Redis 重啟會通過加載dump.rdb文件恢復數據

從配置文件了解RDB

  • 打開redis.conf文件,ctrl+f搜索SNAPSHOTTING,查看對應的內容
    • RDB核心規則配置(重點)
      # save <seconds> <changes>
      # save <指定時間間隔> <執行指定次數更新操作>
      # save ""
      save 900 1
      save 300 10
      save 60 10000
      /*
      滿足條件就將內存中的數據同步到硬盤中。官方出廠配置默認是 900秒內有1個更改,300秒內有10個更改以及60秒內有10000個更改,則將內存中的數據快照寫入磁盤。
      若不想用RDB方案,可以把 save "" 的注釋打開
      */

      指定本地數據庫文件名,一般采用默認的sump.rdb

    • 指定本地數據庫存放目錄,一般也用默認配置 dir? ./

    • 默認開啟數據壓縮?rdbcompression yes:配置存儲至本地數據庫時是否壓縮數據,默認為yes。Redis采用LZF壓縮方式,但占用了一點CPU的時間。若關閉該選項,但會導致數據庫文件變的巨大。建議開啟

觸發RDB快照

  • 在指定的時間間隔內,執行指定次數的寫操作
  • 執行save(阻塞, 只管保存快照,其他的等待) 或者是bgsave (異步)命令
  • 執行flushall 命令,清空數據庫所有數據,意義不大。
  • 執行shutdown 命令,保證服務器正常關閉且不丟失任何數據,意義...也不大

通過RDB文件恢復數據

  • 將dump.rdb 文件拷貝到redis的安裝目錄的bin目錄下,重啟redis服務即可。在實際開發中,一般會考慮到物理機硬盤損壞情況,選擇備份dump.rdb?

RDB 的優缺點

優點

  • 適合大規模的數據恢復。
  • 如果業務對數據完整性和一致性要求不高,RDB是很好的選擇。

缺點

  • 數據的完整性和一致性不高,因為RDB可能在最后一次備份時宕機了。

  • ?備份時占用內存,因為Redis 在備份時會獨立創建一個子進程,將數據寫入到一個臨時文件(此時內存中的數據是原來的兩倍哦),最后再將臨時文件替換之前的備份文件。

  • 所以Redis 的持久化和數據的恢復要選擇在夜深人靜的時候執行是比較合理的。

注意事項

  • SHUTDOWN 和 FLUSHALL 命令都會觸發RDB快照,這是一個坑,請大家注意

AOF 詳解

AOF :Redis 默認不開啟。它的出現是為了彌補RDB的不足(數據的不一致性),所以它采用日志的形式來記錄每個寫操作,并追加到文件中。Redis 重啟的會根據日志文件的內容將寫指令從前到后執行一次以完成數據的恢復工作

從配置文件了解AOF

  • 打開 redis.conf 文件,找到 APPEND ONLY MODE 對應內容
  • redis 默認關閉,開啟需要手動把no改為yes:appendonly yes
  • 指定本地數據庫文件名,默認值為 appendonly.aof:appendfilename "appendonly.aof"
  • 指定更新日志條件
    # appendfsync always
    appendfsync everysec
    # appendfsync no
    /*
    always:同步持久化,每次發生數據變化會立刻寫入到磁盤中。性能較差當數據完整性比較好(慢,安全)
    everysec:出廠默認推薦,每秒異步記錄一次(默認值)
    no:不同步
    */

    配置重寫觸發機制

    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    /*當AOF文件大小是上次rewrite后大小的一倍且文件大于64M時觸發。一般都設置為3G,64M太小了*/

    ?

觸發AOF快照

  • 根據配置文件觸發,可以是每次執行觸發,可以是每秒觸發,可以不同步

根據AOF文件恢復數據

  • 正常情況下,將appendonly.aof 文件拷貝到redis的安裝目錄的bin目錄下,重啟redis服務即可。但在實際開發中,可能因為某些原因導致appendonly.aof 文件格式異常,從而導致數據還原失敗,可以通過命令redis-check-aof --fix appendonly.aof 進行修復 。從下面的操作演示中體會
  • 此處的bin文件夾,是我們人為創建的,其中就是我們通過make install之后,在src文件夾里面生成的可執行的文件

AOF的重寫機制

  • 前面也說到了,AOF的工作原理是將寫操作追加到文件中,文件的冗余內容會越來越多。所以 Redis 新增了重寫機制。當AOF文件的大小超過所設定的閾值時,Redis就會對AOF文件的內容進行壓縮
  • 重寫的原理:Redis 會fork出一條新進程,讀取內存中的數據,并重新寫到一個臨時文件中,并沒有讀取舊文件。最后替換舊的aof文件。
  • 觸發機制:當AOF文件大小是上次rewrite后大小的一倍且文件大于64M時觸發。這里的“一倍”和“64M” 可以通過配置文件修改

AOF 的優缺點

優點:

  • 數據的完整性和一致性更高

缺點:

  • 因為AOF記錄的內容多,文件會越來越大,數據恢復也會越來越慢

總結

  1. Redis 默認開啟RDB持久化方式,在指定的時間間隔內,執行指定次數的寫操作,則將內存中的數據寫入到磁盤中。
  2. RDB 持久化適合大規模的數據恢復但它的數據一致性和完整性較差。
  3. Redis 需要手動開啟AOF持久化方式,默認是每秒將寫操作日志追加到AOF文件中。
  4. AOF 的數據完整性比RDB高,但記錄內容多了,會影響數據恢復的效率。
  5. Redis 針對 AOF文件大的問題,提供重寫的瘦身機制。
  6. 若只打算用Redis 做緩存,可以關閉持久化。
  7. 若打算使用Redis 的持久化。建議RDB和AOF都開啟。其實RDB更適合做數據的備份。AOF出問題了,還有RDB

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447335.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447335.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447335.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

同為程序員 為什么我的工資最低

我看著工資單上每一個開發團隊成員的薪水&#xff0c;慢慢地我不能保持淡定了。 而當我看到我的工資排名是倒數的時候——靠近最后一名——我不由得倒抽一口冷氣。就像圣誕故事中的那個可愛的小男孩Ralphie &#xff0c;想買氣槍卻被忽悠會有危險一樣&#xff0c;我也不斷忽悠…

Docker安裝Redis以及配置Redis環境

1&#xff0c;下載Redis鏡像 首先拉取 Redis 鏡像, 這里我選擇的是 redis:alpine 輕量級鏡像版本 docker pull redis:alpine 下載完成后&#xff0c;通過 docker images 查看我們已經下載的鏡像&#xff0c;看看是否已經下載到本地 2&#xff0c;運行 Redis 容器 docker run …

.NET程序性能的基本要領

摘要&#xff1a;本文分享了性能優化的一些建議和思考&#xff0c;比如不要過早優化、好工具很重要、性能的關鍵&#xff0c;在于內存分配等。開發者不要盲目的沒有根據的優化&#xff0c;首先定位和查找到造成產生性能問題的原因點最重要。 【編者按】Bill Chiles&#xff08…

redis.conf配置文件詳解

基本配置 daemonize no #是否以后臺進程啟動databases 16 #創建database的數量(默認選中的是database 0)save 900 1 #刷新快照到硬盤中&#xff0c;必須滿足兩者要求才會觸發&#xff0c;即900秒之后至少1個關鍵字發生變化save 300 10 #必須是300秒之后至少10個關鍵字發生變…

什么原因成就了一位優秀的程序員?

這些年我曾和很多程序員一起工作&#xff0c;他們之中的一些人非常厲害&#xff0c;而另一些人顯得平庸。不久前因為和一些技術非常熟練的程序員工作感覺很愉快&#xff0c;我花了一些時間在考慮我佩服他們什么呢&#xff1f;什么原因讓優秀的程序員那么優秀&#xff0c;糟糕的…

Redis的哨兵模式Sentinel

sentinel功能 redis的sentinel系統用于管理多個redis服務器&#xff0c;該系統主要執行三個任務&#xff1a;監控、提醒、自動故障轉移。 1、監控&#xff08;Monitoring&#xff09;&#xff1a; Redis Sentinel實時監控主服務器和從服務器運行狀態&#xff0c;并且實現自動…

csdn 到底怎么了?不準轉載?

我轉載了20多文章&#xff0c;很多人閱讀過&#xff0c;但是今天看到閱讀量是0&#xff0c; csdn 到底怎么了&#xff1f; 對用戶這樣&#xff1f;請大家看看是不是這樣&#xff1f;

python3之后版本讀取網頁的內容

import urllib.request url "http://helloworldbook2.com/data/message.txt" #直接通過url來獲取網頁數據 print(第一種) response urllib.request.urlopen(url) code response.getcode() html response.read() mystr html.decode("utf8") response.c…

三十功名塵與土——資深程序員生涯自白

摘要&#xff1a;作者Codist&#xff08;網名&#xff09;在程序員崗位上工作了三十多年&#xff0c;在這期間他悟出了一些真理&#xff0c;比如&#xff0c;成功來自對失敗的總結學習&#xff1b;條條大路通羅馬&#xff0c;羅馬并不在乎你用什么方式到達。你在生活中積累了哪…

linux/unix核心設計思想

1&#xff09; 程序應該小而專一&#xff0c;程序應該盡量的小&#xff0c;且只專注于一件事上&#xff0c;不要開發那些看起來有用但是90%的情況都用不到的特性&#xff1b; 2&#xff09; 程序不只要考慮性能&#xff0c; 程序的可移植性更重要&#xff0c;shell和perl&…

操作系統環境變量

在 Java中&#xff0c;許多類都是 Iterable &#xff0c;主要包括所有的 Collection 類&#xff08;但不包括各種 Maps &#xff09;。 例如&#xff0c;下面的代碼可以顯示所有的操作系統環境變量&#xff1a; // collections/EnvironmentVariables.java // {VisuallyInspect…

用Unix的設計思想來應對多變的需求

摘要&#xff1a;無論是Unix設計&#xff0c;還是面向對象設計&#xff0c;還是別的什么如SOA&#xff0c;ECB&#xff0c;消息&#xff0c;事件&#xff0c;MVC&#xff0c;網絡七層模型&#xff0c;數據庫設計&#xff0c;等等&#xff0c;他們都在干三件事——解耦&#xff…

學習較底層編程:動手寫一個C語言編譯器

動手編寫一個編譯器&#xff0c;學習一下較為底層的編程方式&#xff0c;是一種學習計算機到底是如何工作的非常有效方法。 編譯器通常被看作是十分復雜的工程。事實上&#xff0c;編寫一個產品級的編譯器也確實是一個龐大的任務。但是寫一個小巧可用的編譯器卻不是這么困難。…

Arrays.deepToString() 方法同時適用于基元數組和對象數組

Arrays.deepToString() 方法同時適用于基元數組和對象數組&#xff1a; import java.util.*;public class MultiDimWrapperArray {public static void main(String[] args) {Integer[][] a1 { // Autoboxing{ 1, 2, 3, },{ 4, 5, 6, },};Double[][][] a2 { // Autoboxing{ {…

高效程序員的7個共同特征

要想成為高效的程序員&#xff0c;你需要具備一定的綜合素質才能夠讓你用你所掌握的技能、經驗和知識編寫出有效的代碼。有一些開發人員在技術方面具備一定的技巧&#xff0c;但他們永遠無法成為高效的程序員&#xff0c;就是因為他們缺乏所需的其它幾項特質。本文將給出成為一…

java.util.Array中的方法

概述 asList(): 獲取任何序列或數組&#xff0c;并將其轉換為一個 列表集合 &#xff08;集合章節介紹了此方法&#xff09;。 copyOf()&#xff1a;以新的長度創建現有數組的新副本。 copyOfRange()&#xff1a;創建現有數組的一部分的新副本。 equals()&#xff1a;比較兩…

有關編程的12個猜想

摘要&#xff1a;編程世界的將來如何目前仍難預料&#xff0c;但可以肯定的一點是技術一直在加速發展。本文搜羅出12個獨特的編程視角猜想&#xff0c;一起來看看有哪些猜想在不久的將來就能變為現實。 編程世界的將來如何目前仍難預料&#xff0c;但可以肯定的一點是技術一直…

面試中如何剔除“魚目混珠”程序員?

公司招聘面試事宜是一個耗時耗錢的項目&#xff0c;從挑選簡歷開始&#xff0c;還要花更多的時間面試候選人。有的時候這些人才機構會向你保證這些人都是Java天才、SQL專家、堆棧開發者等等&#xff0c;但實際上真實情況遠不及你想想的。對于一個公司來說&#xff0c;執行招聘面…

InputStream 類型

輸入流類型 I/O-1 類功能構造器參數如何使用ByteArrayInputStream允許將內存的緩沖區當做 InputStream 使用緩沖區&#xff0c;字節將從中取出作為一種數據源&#xff1a;將其與 FilterInputStream 對象相連以提供有用接口StringBufferInputStream將 String 轉換成 InputStr…

java容器相關問題

同步類容器 1&#xff0c;這些復合操作在多線程并發地修改容器時&#xff0c;可能會表現出意外的行為&#xff0c;最經典的便是ConcurrentModificationException&#xff0c;原因是當容器迭代的過程中&#xff0c;被并發的修改了內容&#xff0c;這是由于早期迭代器設計的時候…