<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
首先,RDB持久化方式會產生一個經過壓縮的二進位制檔案,Redis伺服器在啟動之初,通過這個檔案可以還原資料庫的狀態。那麼我們接下來看下RDB檔案是如何實現儲存和載入的。
RDB檔案的儲存有兩個命令可以實現,分別是save
和bgsave
,執行後都會生成新的RDB檔案,區別是save
會阻塞伺服器的程序,直到RDB檔案建立完成為止,期間伺服器不能處理任何使用者端的命令請求。而bgsave
通過派生出一個子程序,由子程序來完成RDB檔案的建立,期間伺服器正常處理使用者端的命令請求。其實這兩個命令的底層實現方式都一樣,只不過一個是主程序來做,另一個是通過子程序來完成。
在redis.conf檔案中,有兩個引數是和rdb的檔案儲存相關:
// 這個是rdb檔案的名稱 dbfilename dump.rdb // 這個是rdb檔案的儲存路徑,這是相對路徑,相對於redis-server的啟動路徑 dir ./
在redis伺服器啟動之初,會去查詢有沒有rdb的持久化檔案存在,如果有就會自動載入,當然前提是沒有開啟aof持久化的功能。在rdb載入期間會,伺服器處於阻塞裝填,直到載入工作完全結束。
save
命令執行期間,所有使用者端命令都會被拒絕執行。
bgsave
命令執行期間,使用者端傳送的save
和bgsave
命令會被拒絕執行,但是使用者端傳送的bgrewriteaof
不會拒絕但會被阻塞,直到當前的bgsave
命令執行完畢。但是值得說明的是,如果伺服器在執行bgrewriteaof
命令期間,使用者端傳送的bgsave
命令會被伺服器拒絕。當然這是站在效能角度考慮,否則fock出兩個子程序,大量的進行磁碟的讀寫,會影響整個伺服器的效能。
使用者可以通過組態檔給RDB的持久化設定儲存策略,看一下redis.conf檔案中的設定:
save 900 1
save 300 10
save 60 10000
以上的預設設定可以表示為:伺服器在900秒之內,至少進行了1次的修改,在300秒之內至少進行了10次修改,在60秒之內至少進行了10000次修改。這三種策略只要滿足一個,即可觸發RDB的持久化。
這裡需要了解一下,Redis是怎麼基於這些設定策略實現自動化間歇性儲存RDB檔案的,還是回到RedisServer這個這個結構體的原始碼中看一下:
struct redisServer { // 陣列,用於儲存redis.conf設定的持久化策略 struct saveparam *saveparams; /* Save points array for RDB */ // 上面這個陣列的長度 int saveparamslen; /* Number of saving points */ // 記錄上一次持久化到現在伺服器修改了多少鍵值對 long long dirty; /* Changes to DB from the last save */ // 記錄上一次RDB持久化的UNIX時間戳 time_t lastsave; /* Unix time of last successful save */ }
在redisServer中,有saveparams陣列專門儲存我們設定的持久化策略,這裡使用到了saveparam這個結構體,看一下原始碼:
struct saveparam { // 這裡是組態檔save的第1個引數 time_t seconds; // 這裡是組態檔save的第2個引數 int changes; };
這樣,組態檔中的持久化策略就記錄到了redisServer.saveparam屬性中,還是會基於serverCron這個時間事件函數,100ms執行一次,每次會檢查 dirty 和 lastsave 記錄的修改鍵值對數量和時間差,是否匹配到了saveparam中設定的持久化策略,如果命中就進行新一輪的RDB持久化。
和RDB不同,AOF是通過記錄Redis伺服器中執行的寫命令來記錄資料庫狀態的,類似於mysql的binlog,當然儲存的內容是經過協定轉換的命令。在伺服器啟動之初,通過載入和執行AOF檔案中的命令來還原資料庫的狀態。
在伺服器執行命令之後,並不是立刻寫入aof檔案中,而是先寫入 aof_buf緩衝區裡面,這也是redisServer的一個屬性結構:
struct redisServer { // aop緩衝區,記錄伺服器寫入的命令 sds aof_buf; /* AOF buffer, written before entering the event loop */ }
我們再看一下redis.conf關於aof持久化的一個設定:
// 這個表示每次執行都會寫入 # appendfsync always // 這個表示每秒寫入一次 appendfsync everysec // 這個由作業系統決定,無法控制 # appendfsync no
AOF實現持久化的原理是這樣的,使用者端執行的命令會先記錄到 redisServer.aof_buf 中,然後基於組態檔的appendfsync策略決定什麼時候同步到AOF檔案中。這裡的同步也會經過兩個步驟:
我們知道Redis是基於Reactor網路模型,不斷進行事件迴圈,每進行一輪的事件迴圈,都會執行步驟1,所以從aof_buf 到 pagecache總是會發生。但是步驟2就跟appendfsync有關係了:
預設設定是everysec,即每秒執行一次資料落盤儲存。
因為AOF檔案中包含了重建資料庫狀態的所有寫命令,所以伺服器只要讀入並全部執行一遍就可以完成資料庫狀態的還原。伺服器在啟動之初,會建立一個不帶網路連線的偽使用者端來做這件事,在載入命令完成後,這個使用者端的使命就結束了。
隨著寫入到AOF檔案的命令越來越多,這個檔案體積會越來大,會對宿主機或檔案還原造成一定的影響,所以需要通過AOF檔案的重寫來解決檔案體積膨脹的問題。
AOF檔案重寫並不是對現有AOF檔案進行處理,而是基於資料庫當前的狀態來實現的。伺服器會從資料庫中讀取鍵對應的值,然後用一條命令去記錄鍵值對,代替之前可能存在的多條命令,寫入到一個新的AOF檔案中,這就是AOF重寫功能實現的原理。需要注意的是,對於某些元素比較多的集合或者列表(預設設定是64個),這個一條命令可能拆分成多條實現,避免造成使用者端輸入緩衝區溢位的情況。
和bgsave
一樣,AOF重寫的動作也是放到子程序去執行,這樣可以保證父程序可以繼續處理名請求。但是這裡會有一個問題,就是AOF檔案重寫期間,父程序處理命令請求之後,會和重寫AOF檔案時的資料庫狀態不一致。Redis解決這個問題的方法是設定一個AOF重寫緩衝區,子程序一單建立並且開始重寫命令之後,父程序處理的所有寫命令請求都會記錄到AOF重寫緩衝區。當子程序重寫工作完成之後,會生成一個新的AOF檔案,向父程序傳送一個訊號,父程序在接受此訊號,開始執行以下工作:
以上兩步,父程序會造成伺服器程序的阻塞,但其他時間,都不會阻塞,整個重寫動作對伺服器效能的影響降到了最低,以上就是bgrewriteaof
命令的實現原理。
到此這篇關於Redis RDB與AOF持久化方式詳細講解的文章就介紹到這了,更多相關Redis RDB與AOF內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45