redis的兩種持久化方案

来源:https://www.cnblogs.com/zhxiansheng/archive/2019/05/13/10857310.html
-Advertisement-
Play Games

前言 人生在於折騰系列,網路,多線程等系列博客樓主還在繼續折騰也不會放棄。這是全新的系列,緩存的知識其實並不僅僅在於簡單的增刪改查,我覺得有必要全面深入的學習一波。記錄學習的過程與體悟。 RDB 什麼是RDB 對redis中的數據執行周期性的持久化,通過配置文件中設置檢查間隔時間與備份觸發條件來對數 ...


前言

人生在於折騰系列,網路,多線程等系列博客樓主還在繼續折騰也不會放棄。緩存的知識其實並不僅僅在於簡單的增刪改查,我覺得有必要全面深入的學習一波。記錄學習的過程與體悟。

RDB

什麼是RDB

對redis中的數據執行周期性的持久化,通過配置文件中設置檢查間隔時間與備份觸發條件來對數據進行周期性的持久化

RDB持久化的優點

  1. RDB會生成多個數據文件,每個數據文件都代表了某一個時刻中redis的數據,這種多個數據文件的方式,非常適合做冷備份。

  2. RDB對redis對外提供的讀寫服務,影響非常小,可以讓redis保持高性能,因為redis主進程只需要fork一個子進程,讓子進程執行磁碟IO操作來進行RDB持久化即可

  3. 相對於AOF持久化機制來說,直接基於RDB數據文件來重啟和恢復redis進程,更加快速

RDB持久化的缺點

  1. 如果想要在redis故障時,儘可能少的丟失數據,那麼RDB沒有AOF好。一般來說,RDB數據快照文件,都是每隔5分鐘,或者更長時間生成一次,這個時候就得接受一旦redis進程宕機,那麼會丟失最近5分鐘的數據。這個問題,也是rdb最大的缺點,就是不適合做第一優先的恢復方案,如果你依賴RDB做第一優先恢復方案,會導致數據丟失的比較多

  2. RDB每次在fork子進程來執行RDB快照數據文件生成的時候,如果數據文件特別大,可能會導致對客戶端提供的服務暫停數毫秒,或者甚至數秒一般不要讓RDB的間隔太長,否則每次生成的RDB文件太大了,對redis本身的性能可能會有影響的

如何配置redis的RDB持久化

redis.conf文件,去配置持久化

save 60 1000

每隔60s,如果有超過1000個key發生了變更,那麼就生成一個新的dump.rdb文件,就是當前redis記憶體中完整的數據快照,這個操作也被稱之為snapshotting,快照

也可以手動調用save或者bgsave命令,同步或非同步執行rdb快照生成。(save在生成dump.rdb文件的時候redis主線程將會被阻塞,bgsave則不會阻塞redis主線程)

save可以設置多個,就是多個snapshotting檢查點,每到一個檢查點,就會去check一下,是否有指定的key數量發生了變更,如果有,就生成一個新的dump.rdb文件

AOF

什麼AOF

AOF機制對每條寫入命令作為日誌記錄,以append-only的模式寫入一個日誌文件中,在redis重啟的時候,可以通過回放AOF日誌中的寫入指令來重新構建整個數據集。

AOF持久化的優點

  1. AOF可以更好的保護數據不丟失,一般AOF會每隔1秒,通過一個後臺線程執行一次fsync操作(fsync的功能是確保所有已修改的內容已經正確同步到硬碟上,該調用會阻塞等待直到設備報告IO完成。),最多丟失1秒鐘的數據每隔1秒,就執行一次fsync操作,保證oscache中的數據寫入磁碟中redis進程掛了,最多丟掉1秒鐘的數據。

  2. AOF日誌文件以append-only模式寫入,所以沒有任何磁碟定址的開銷,寫入性能非常高,而且文件不容易破損,即使文件尾部破損,也很容易修複。

  3. AOF日誌文件即使過大的時候,出現後臺重寫操作,也不會影響客戶端的讀寫。因為在rewritelog的時候,會對其中的指導進行壓縮,創建出一份需要恢複數據的最小日誌出來。再創建新日誌文件的時候,老的日誌文件還是照常寫入。當新的merge後的日誌文件ready的時候,再交換新老日誌文件即可。

  4. AOF日誌文件的命令通過非常可讀的方式進行記錄,這個特性非常適合做災難性的誤刪除的緊急恢復。比如某人不小心用flushall命令清空了所有數據,只要這個時候後臺rewrite還沒有發生,那麼就可以立即拷貝AOF文件,將最後一條flushall命令給刪了,然後再將該AOF文件放回去,就可以通過恢復機制,自動恢復所有數據。

AOF持久化機制的缺點

  1. 對於同一份數據來說,AOF日誌文件通常比RDB數據快照文件更大。

  2. AOF開啟後,支持的寫QPS會比RDB支持的寫QPS低,因為AOF一般會配置成每秒fsync一次日誌文件。儘管每秒一次fsync,性能也還是很高的,如果你要保證一條數據都不丟,也是可以的,AOF的fsync設置成沒寫入一條數據,fsync一次,那就完蛋了,redis的QPS將會更低。

  3. 以前AOF發生過bug,就是通過AOF記錄的日誌,進行數據恢復的時候,沒有恢復一模一樣的數據出來。所以說,類似AOF這種較為複雜的基於命令日誌/merge/回放的方式,比基於RDB每次持久化一份完整的數據快照文件的方式,更加脆弱一些,容易有bug。不過AOF就是為了避免rewrite過程導致的bug,因此每次rewrite並不是基於舊的指令日誌進行merge的,而是基於當時記憶體中的數據進行指令的重新構建,這樣健壯性會好很多。

  4. 唯一的比較大的缺點,其實就是做數據恢復的時候,會比較慢,還有做冷備,定期的備份,不太方便,可能要自己手寫複雜的腳本去做,做冷備不太合適。RDB恢復日誌,就是一份數據文件,恢復的時候,直接載入到記憶體中即可。而AOF則不同,做數據恢復的時候,其實是要回放和執行所有的指令日誌,來恢復出來記憶體中的所有數據的。

如何配置redis的AOF持久化

AOF持久化,預設是關閉的,預設是打開RDB持久化

appendonly yes,可以打開AOF持久化機制,在生產環境裡面,一般來說AOF都是要打開的,除非你說隨便丟個幾分鐘的數據也無所謂。打開AOF持久化機制之後,redis每次接收到一條寫命令,就會寫入日誌文件中,當然是先寫入os cache的,然後每隔一定時間再fsync一下。

如果AOF和RDB都開啟了,redis重啟的時候,優先通過AOF進行數據恢復的,因為aof數據比較完整

可以配置AOF的fsync策略,有以下三種策略可以選擇:

  1. always: 每次寫入一條數據,立即將這個數據對應的寫日誌fsync到磁碟上去,性能非常非常差,吞吐量很低; 確保說redis里的數據一條都不丟,那就只能這樣了

  2. everysec: 每秒將os cache中的數據fsync到磁碟,這個最常用的,生產環境一般都這麼配置,性能很高,QPS還是可以上萬的

  3. no: 僅僅redis負責將數據寫入os cache就撒手不管了,然後後面os自己會時不時有自己的策略將數據刷入磁碟,不可控了


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

-Advertisement-
Play Games
更多相關文章
  • 字元串由幾個單片語成,一般情況之下以空格分隔來計算即可。 實現方法,參考下麵自定義函數: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- -- Author: Insus.NET -- Create date: 2019-05-13 -- Up ...
  • 大約2年前,寫過一篇《字元串中去除多餘的空格保留一個(C#)》https://www.cnblogs.com/insus/p/7954151.html 今天,Insus.NET使用MS SQL Server來實現相同的功能。現Insus.NET已經把它寫成一個自定義函數。 SET ANSI_NULL ...
  • 1 查詢語句 查看賬戶下的所有表 1 select * from tab; 查看賬戶下的所有表的詳細信息 1 select * from user_tables; 1.1 select select 用於從數據看查詢數據。語法: 1 select field1,filed2,.. . 2 from ...
  • -->尋找低效的SQL語句 ,下麵的語句主要適用於從視圖v$sqlarea中獲得當前運行下且耗用buffer_gets較多的SQL語句 SELECT executions , disk_reads , buffer_gets , ROUND( ( buffer_gets - disk_reads ) ...
  • Rman常用命令 Preview選項 1) 顯示用於還原system表空間數據文件的備份文件 RMAN> restore datafile 2 preview; 2) 顯示用於還原特定的表空間的備份文件; RMAN> restore tablespace users preview; 3) 顯示執行 ...
  • 文章大綱 一、搜索引擎框架基礎介紹二、ElasticSearch的簡介三、ElasticSearch安裝(Windows版本)四、ElasticSearch操作客戶端工具--Kibana五、ES的常用命令六、Java連接ElasticSearch進行數據操作七、項目源碼與參考資料下載八、參考文章 一 ...
  • 最近Oracle資料庫總是出問題,於是卸載乾凈後重新安裝,安裝過程中遇到了一些問題於是百度解決,在這裡記錄下來方便以後查看。 win10系統安裝oracle11g時遇到INS-13001環境不滿足最低要求 在安裝時點擊setup.exe之後,出現了:[INS-13001]環境不滿足最低要求 這時,打 ...
  • 1.大數據與機器學習的關係: 大數據領域我們做的是數據的存儲和簡單的統計計算,機器學習在大數據的應用是為了發現數據的規律或模型,用機器學習演算法對數據進行計算的到的模型,從而決定我們的預測與決定的因素(比如在大數據用戶畫像項目里,生成的特殊用戶欄位)。 2.大數據在機器學習的應用 目前市場實際開發模式 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...