【Redis基礎】持久化機制
1.RDB
(1) 定義
RBD:snapshotting(快照)是預設方式,將記憶體中資料以快照的方式寫入到二進位制檔案中,預設檔名為dump.rdb
(2)觸發rdbSave過程的方式
- save命令:阻塞Redis伺服器程序,直到RDB檔案建立完畢為止。
- bgsave命令:派生出一個子程序,然後由子程序負責建立RDB檔案,父程序繼續處理命令請求。
- master接收到slave發來的sync命令
- 定時save(配置檔案中制定)
注:
fork的作用是複製一個與當前程序一樣的程序。新程序的所有資料(變數、環境變數、程式計數器等),值都和原程序一致,但是是一個全新的程序,並作為原程序的子程序
執行flushall命令(清空所有資料庫),也會產生dump.rdb檔案,但裡面是空的,無意義
命令bgsave與bgrewriteaof不能同時執行,若bgsave正在執行,則bgrewriteaof延遲到bgsave執行完再執行。若bgrewriteaof正在執行,則伺服器拒絕執行bgsave命令。
(2) 配置:
預設條件
- save 900 //900秒內如果超過1個key被修改,則發起快照儲存
- save 300 10 //300秒內如果超過10個key被修改,則發起快照儲存
- save 60 10000 //60秒內如果超過10000個key被修改,則發起快照儲存
伺服器狀態
- saveparams屬性:記錄了儲存條件的陣列
- dirty計數器:記錄距離上一次save/bgsave命令之後,伺服器對資料庫狀態修改了多少次
- lastsave屬性:是一個Unix時間戳,記錄了上一次成功執行save/bgsave命令的時間。
(3)RDB檔案結構
RDB檔案結構
- REDIS長度為5個位元組,程式在載入檔案時,可以快速檢查所載入的檔案是否是RDB檔案。
- db_version長度為4個位元組,一個字串表示的整數,記錄了RDB檔案的版本號。
- database包含零個或任意多個數據庫,以及鍵值對的資料
- EOF常量的長度為1個位元組,標誌著RDB檔案正文內容的結束。
- check_sum是一個8位元組長的無符號整數,儲存著一個校驗和,由前面四部分計算得出的。
database部分
- SELECTDB常量的長度為1位元組,接下來讀入的將是一個數據庫號碼
- db_number儲存著一個數據庫號碼。
- key_value_pairs 儲存了資料庫中的所有鍵值對資料,由TYPE、key、value組成
完整的檔案結構圖
(4)記憶體中資料與磁碟互動
(5)優點
- 適合大規模的資料恢復,對資料完整性和一致性要求不高
(6)缺點
由於快照方式是在一定間隔時間做一次的,若redis出現宕機,就會丟失最後一次快照後的所有修改。
fork的時候,記憶體中的資料被克隆了一份,大致2倍的膨脹性需要考慮如何停止
2.AOF
(1) 定義
AOF(appendonly file):通過儲存Redis伺服器所執行的寫命令來記錄資料庫狀態。
(2)優點
redis將每一個收到的寫命令都通過write函式追加到檔案中,當redis重啟時會通過重新執行檔案中儲存的寫命令來在記憶體中重建整個資料庫的內容
(3)缺點
由於os會在核心中快取write做的修改,所以可能不是立即寫到磁碟上,可能會丟失部分資料修改。
相同資料集的資料而言aof檔案要遠大於rdb檔案,恢復速度慢於rdb,aof執行效率要慢於rdb,每秒同步策略效率較好,不同步效率和rdb相同
(4) 解決方法:通過配置檔案進行修改
- Appendonly yes //啟用AOF持久化方式
- Appendfsync always //收到寫命令就立即寫入磁碟(最慢)但是保證完全的持久化
- Appendfsync everysec //每秒寫入磁碟一次,在效能和持久化方面做了很好的折中(預設)
Appendfsync no //完全依賴os,效能最好,持久化沒有保證。
修復:如果aof檔案被破壞, redis-check-aof–fix進行修復,在flushAppendOnlyFile函式中,若出現斷電等情況,就將寫出錯的情況記錄到日誌裡,之後會處理錯誤。
- 恢復:重啟redis然後重新載入,如果aof和rdb兩種持久化工具都開啟,AOF優先。因為在通常情況下AOF檔案儲存的資料集要比RDB檔案儲存的資料集要完整.
(5)AOF的步驟
- 命令追加:將命令追加到AOF緩衝區
- 檔案寫入
- 檔案同步
(6)AOF重寫(bgrewriteaof)
出現原因
隨著伺服器執行時間的流逝,AOF檔案的內容會越來越多,為了解決AOF檔案體積膨脹的問題,Redis提供了AOF檔案重寫。AOF重寫的實現原理
fork出一條新程序來將檔案重寫(也是先寫臨時檔案最後再rename),遍歷新程序的記憶體中資料,每條記錄有一條的Set語句。重寫aof檔案的操作,並沒有讀取舊的aof檔案,而是將整個記憶體中的資料庫內容用命令的方式重寫了一個新的aof檔案,重寫觸發機制
Redis會記錄上次重寫時的AOF大小,預設配置是當AOF檔案大小是上次rewrite後大小的一倍且檔案大於64M時觸發(預設)AOF後臺重寫
- AOF重寫程式放到子程序中執行,為了解決子程序下資料不一致的問題,Redis伺服器設定了一個AOF重寫緩衝區,在伺服器建立子程序之後使用,
- 當Redis執行完一個命令後,它會同時將這個寫命令傳送給AOF緩衝區和AOF重寫緩衝區,這樣就可以保證現有AOF檔案的處理工作照常進行,而伺服器的所有寫命令都會被記錄到AOF重寫緩衝區裡。
(7)AOF圖解
3.虛擬記憶體方式:
虛擬記憶體方式是Redis來進行使用者空間的資料換入換出的一個策略,此種方式在實現的效果上比較差,主要問題是程式碼複雜,重啟慢,複製慢等等,目前已經被作者放棄。
4.diskstore方式:
diskstore方式是作者放棄了虛擬記憶體方式後選擇的一種新的實現方式,也就是傳統的B-tree的方式。
本人才疏學淺,若有錯,請指出,謝謝!
相關推薦
【Redis基礎】持久化機制
1.RDB (1) 定義 RBD:snapshotting(快照)是預設方式,將記憶體中資料以快照的方式寫入到二進位制檔案中,預設檔名為dump.rdb (2)觸發rdbSave過程的方式 save命令:阻塞Redis伺服器程序,直到RDB檔案建立完畢
【Redis基礎】Redis在專案中實戰
redis搭建,叢集搭建,多屬於運維知識,基本瞭解就可以。但是在專案如何讓redis發揮它的特長就屬於我們需要掌握和探索的。接下來講解一下在專案中如何使用redis來做快取的。 適用場景 什麼樣的情況才會用到快取呢??一個專案中有些資料長時間不會發生變動,但是使用者又訪問
【Redis基礎】客戶端原始碼解析
1.定義 Redis客戶端與伺服器之間通過TCP協議進行通訊。TCP協議是一種流式協議,資料以位元組流的形式進行傳遞,沒有固有的”報文”或”報文邊界”的概念,如果需要設定邊界,需要應用層自行處理。 2.原始碼 客戶端redis.h/redisClien
【redis 基礎學習】(六)Redis HyperLogLog
內存 ger detail edi 統計 固定 ogl per ren 摘自:http://www.mayou18.com/detail/o6M0v9mi.html Redis HyperLogLog 結構講解 Redis 在 2.8.9 版本添加了 HyperLog
【Java 基礎】15 Java 反射機制
反射 為什麼使用反射 需求:我公司定義了一組介面,然後第三方公司按照我公司的介面 實現了一套功能,然後交給我們,但是我們公司的專案已經結束,如何實現動態載入第三方公司提供的功能。 什麼是反射 反射就是把 Java 類中的各種成分對映成一個個的 Java 物件。例
【java基礎】類載入機制
類載入機制 1.什麼是類的載入? 類載入機制指的是將.class檔案中的二進位制資料讀入到記憶體中,將其放在執行時資料區的方法區內,然後在堆區建立一個java.lang.Class物件,用來封裝類在方法區內的資料結構。類的載入的最終產品是位於堆區的Class物件,Clas
【Redis學習】Redis筆記(一)——特點、基礎命令和資料結構
更新時間:2018-10-13 Redis的特性 速度快 持久化(斷電不丟資料) 多種資料結構 支援多種客戶端語言 功能豐富 操作簡單 主從複製 高可用,分散式 Redis的通用命令 key
【Java基礎】執行緒和併發機制
前言 在Java中,執行緒是一個很關鍵的名詞,也是很高頻使用的一種資源。那麼它的概念是什麼呢,是如何定義的,用法又有哪些呢?為何說Android裡只有一個主執行緒呢,什麼是工作執行緒呢。執行緒又存在併發,併發機制的原理是什麼。這些內容有些瞭解,有些又不是很清楚,所以有必要通過一篇文章的梳理,弄清
【redis 基礎篇三】set集合常用命令
在使用集合的過程中,我們都明白他是通過Key-value的形式來儲存的,在存入資料的時候將值賦值給一個key值,去出的時候,我不管你那個value值跑到了什麼位置,我只要通過這個key值就可
【java基礎】程式設計師你真的理解反射機制嗎?
目錄 前言 1、反射的概述 2、正式使用反射之前很有必要了解的Class類 3、反射的使用 前言 很多講解反射的部落格文章並沒有詳細講解Class類,~當然包括之前的我也一樣~,
【Android基礎】利用Intent在Activity之間傳遞數據
一次 there center ack and block for success display 前言: 上一篇文章給大家聊了Intent的使用方法。怎樣用Intent啟動Activity和隱式Intent。這一篇文章給大家聊聊怎樣利用Intent在Activit
【 js 基礎 】作用域和閉包
代碼 var 垃圾回收器 間接 undefined scrip 運行時 例子 解析 一、編譯過程 常見編譯性語言,在程序代碼執行之前會經歷三個步驟,稱為編譯。 步驟一:分詞或者詞法分析 將由字符組成的字符串分解成有意義的代碼塊,這些代碼塊被稱為詞法單元。 例子: v
【SSH 基礎】淺談Hibernate關系映射(3)
區別 ack 增加 ans 存儲結構 mil pro 映射 方向 繼上篇博客 一對多關聯映射(單向) 上面我們介紹了多對一,我們反過來看一對多不就是多對一嗎?那還用再進行不同的映射嗎?有什麽區別嗎?一對多和多對一映射原理是一致的,存儲是同樣的。也就是生成的數據庫
【Java基礎】RTTI與反射之Java
start auth try dword star sse from tac sed 1 ; Example assembly language program -- 2 ; Author: Karllen 3 ; Date: revised 05/2014
轉載:【Java基礎】InputStream 、 InputStreamReader和BufferedReader
gen 結果 取字符 sys try eight string font buffer 來源:http://blog.csdn.net/zgljl2012/article/details/47267609 在Java中,上述三個類經常用於處理數據流,下面介紹一下三個類的
【 js 基礎 】Javascript “繼承”
一份 類繼承 屬性。 淺拷貝 創建 生成 特殊 並不會 也會 【 js 基礎 】Javascript “繼承” 是時候寫一寫 “繼承”了,為什麽加引號,因為當你閱讀完這篇文章,你會知道,說是 繼承 其實是不準確的。 一、類1、傳統的面向類的語言中的類:類/繼承 描述
【Linux基礎】Linux基礎命令行學習筆記
esc 隱藏 python chm 合並 tree 位置 常用 輸入 絕對路徑:cd /home/python相對路徑:cd Downloads . 表示:當前那路徑..表示:當前路徑的上一層../.. 表示:當前路徑的上二層 沒有...或者以上的 ls: ls 查看當
【 js 基礎 】為什麽 call 比 apply 快?
如果 分享 叠代 [1] get blank 3.4 -a case 這是一個非常有意思的問題。 在看源碼的過程中,總會遇到這樣的寫法: 1 var triggerEvents = function(events, args) { 2 var ev, i
【計算機基礎】主機名,IP,域名,端口,DNS服務器的通俗理解
net 例如 本地 房子 新的 數字 baidu 域名解析 什麽 在很早的時候,世界上只有幾臺計算機,這幾臺計算機的擁有者想互相連接起來以方便聊天約炮,怎麽辦呢?他們給各自的計算機起了一個名字,比如張三,李四,王二,以後他們就通過這個計算機名字來相互連接。這幾個名字可以
【dubbo基礎】dubbo學習過程、使用經驗分享及實現原理簡單介紹
multi spring配置 不同 影響 為什麽 exception 同事 sock services 一、前言 部門去年年中開始各種改造,第一步是模塊服務化,這邊初選dubbo試用在一些非重要模塊上,慢慢引入到一些稍微重要的功能上,半年時間,學習過程及線上使用遇到的些問