Redis 持久化之 AOF 策略

1.? 什么是 AOF

AOF 是 append only file,AOF 文件中記錄了每次的操作指令,在啟動 Redis 時,會將 AOF 文件中的數據讀取出來以恢復數據。

2. 開啟 AOF

Redis 默認關閉 AOF,可以通過將 Redis 配置文件中的?appendonly 設置為 yes,這樣就開啟了 AOF,此時 RDB 就會關閉,只能使用 AOF 和 RDB 中的一個。

3. AOF 的工作流程

用戶執行指令后,會將該指令寫入到 AOF 緩沖區(aof_buf,即一段內存緩沖區),當新的指令數量達到一定時,就會將這些新的指令寫入到 AOF 文件中,再保存至硬盤。

注意:

  • 在向硬盤中寫數據時,不是用戶執行了一條新指令就寫一條,而是將新指令積累到一定數量后統一進行寫入,這樣可以減少寫硬盤的次數,從而降低寫硬盤對 Redis 性能的影響。
  • Redis 將 AOF 文件寫入硬盤是將文件中的數據追加到原文件后,屬于順序讀寫,速度相對較快。
  • 如果在寫 AOF 緩沖區時主機突然掉電了,由于數據是存儲在硬盤上的,那么這些數據也會消失不見。這就與 Redis 寫 AOF 文件的頻率有關。

4.?AOF 緩沖區同步文件策略

上面我們談到,當由于有些數據是存儲在 AOF 緩沖區的,那么就有可能因為某些原因導致內存上的數據消息,我們可以通過修改緩沖區的刷新策略盡可能地減少上述的問題。

Redis 提供的刷新策略有三種:

  • always:只要用戶執行了一條指令,就將這條指令寫入硬盤;
  • everysec: Redis 默認策略,以 1s 為刷新區間,每隔 1s 就將新指令寫入硬盤;
  • no:操作系統自行刷新緩沖區。

三種刷新策略的比較:

  • always:刷新頻率最高,數據可靠性最高,但由于涉及到頻繁寫硬盤,就會降低 Redis 性能;
  • everysec: 刷新頻率相較于 always 較低,數據可靠性也會降低,但是由于寫硬盤的頻率降低了,Redis 的性能也會提高;
  • no:刷新頻率最低,數據可靠性最差,寫硬盤的頻率最低,Redis 性能最高。

5. AOF 文件重寫機制

隨著執行的指令數越來越多,那么寫入 AOF 文件中的數據也就會越來越多,導致 AOF 文件變得越來越大。由于 Redis 在啟動時會將 AOF 中的數據取出,就導致 Redis 的啟動時間變長。

  • Redis 將AOF 文件進行壓縮,將多條指令壓縮為一條指令,如:set key1 aaa、set key1?bbb、set key1 ccc,那么就會將這三條指令壓縮為 set key1 ccc,以此類推;
  • Redis 也會將 AOF 中已經超時的數據刪除,以減小文件的大小;
  • 刪除無效指令,如:del、keys 等。

較小的 AOF 文件會加快 Redis 程序的啟動速度,也會減少硬盤的占用。

6. 觸發 AOF 重寫機制

6.1 手動觸發

  • 手動執行 bgrewriteaof 指令

6.2 自動觸發

  • auto-aof-rewrite-min-size:表示觸發重寫時 AOF 的最小文件大小,默認為 64MB。
  • auto-aof-rewrite-percentage:代表當前 AOF 占用大小相比較上次重寫時增加比例。

7. AOF 重寫流程

  1. 與 RDB 一樣,父進程首先會創建子進程,子進程將指令存入新 AOF 文件中,父進程依然接收客戶端請求,子進程進行重寫操作;
  2. 由于在子進程進行重寫時,依然會有新的指令依次執行,于是父進程會將新的指令同時寫入aof_buf 和 aof_rewrite_buf(也是一段內存緩沖區);
  3. 當子進程完成復制后,就會給父進程發送信號,父進程就會將 aof_rewrite_buf 中的數據寫入到新 AOF 文件中;
  4. aof_rewrite_buf 中的數據寫入完成后,就會將新的 AOF 文件代替舊的 AOF 文件。

注意:

  • 子進程在進行重寫時,只是將 Redis 中的數據取出來以 AOF 文件的形式存入新 AOF 文件,并不關系指令的操作流程;
  • AOF 文件是以文本形式存儲數據的,而 RDB 文件是以二進制文件存儲數據的,相比之下,讀取 RDB 文件中的數據比讀取 AOF 文件中的數據速度更快;
  • 既然父進程已經將新的指令寫入到新的 AOF 文件中,那為什么還要重寫舊 AOF 文件?這是因為若在子進程重寫的過程中,如果發生主機掉電等問題,由于新 AOF 文件是存儲在內存中的,那么新 AOF 文件在主機重啟后就會消失,新的指令就不會生效。若將新指令同時寫入到舊 AOF 文件中,由于舊 AOF 文件是存儲在硬盤上的,那么在 Redis 重啟后依然能獲取到舊 AOF 文件中的數據,新執行的指令也就會生效,保證了數據完整性。這也就是 AOF 比 RDB 可靠的體現;
  • 若在執行?bgrewriteaof 之前就已經有子進程在進行 AOF 重寫操作,那么就不會執行此次重寫;
  • 若在執行?bgrewriteaof 之前已經有子進程在進行 RDB 重寫操作,那么會等待 RDB 重寫執行完再執行 AOF 重寫操作。

8. 混合持久化

由于 AOF 文件中的數據是以文本形式存儲的,那么在啟動 Redis 時讀取 AOF 文件中的內容所消耗的時間就會變多,于是可以采取使用 RDB 文件存儲方式,即使用二進制存儲數據,那么就會加快文件的讀取速度。

在 Redis 的配置文件中,若將 aof_use_rdb_preamble 設置為 yes,就表示以二進制形式存儲數據。Redis 默認?aof_use_rdb_preamble 為 yes。

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

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

相關文章

實現OFD轉換PDF文件的實用方法

ODF格式的文件屬于國內新型的文件格式,一般應用在保密等級比較高的系統或者單位中,比如一般政務方面或者法律行業經常會用到這種類型的文件,但是有些時候我們把文件分享給別人的時候別人不一定能打開,這時候就需要把OFD文件轉換成…

JSON + 存儲過程:SaaS 架構下的統一接口與租戶定制之道

在多租戶 SaaS 系統中,不同客戶往往有差異化的業務邏輯、字段要求與流程規則。傳統“統一模型 配置參數”的開發模式,雖然具有可控性,但在高度動態、合作多樣化的場景下,逐漸暴露出擴展困難、上線周期長、定制成本高等問題。 隨…

各種常用的串口助手工具分享

記錄一篇常用串口工具的文章 工具的下載鏈接:https://download.csdn.net/download/m0_59415345/91204823?spm1001.2014.3001.5503 各工具的使用操作說明參考嵌入式hxydj博主的文章:https://blog.csdn.net/qq_20222919/article/details/117038284

AVL樹的簡潔寫法

文章目錄 零、寫在前面一、AVL 樹定義1.1 性質1.2 樹高的證明 二、AVL樹實現(AVL樹實現名次樹)2.1 節點定義2.2 左/右旋轉2.3 zig-zag / zag-zig 雙旋2.4 重平衡函數2.5 插入2.6 刪除2.7 排名查詢2.8 查前驅/后繼2.9 查第 k 小2.10 完整代碼 三、online …

紅外圖像增強(dde):基于“基礎層-細節層”分解的增強算法

1、引言 與可見光圖像相比,紅外熱成像捕捉的是物體表面的溫度分布,其原始數據(通常為12位或14位)包含了極寬的溫度動態范圍。然而,人眼能夠感知的灰度范圍以及顯示設備能夠展示的灰度級(通常為8位&#xf…

Java-day28-其他流

1. 緩沖流 昨天學習了基本的一些流,作為IO流的入門,今天我們要見識一些更強大的流。比如能夠高效讀寫的緩沖流,能夠轉換編碼的轉換流,能夠持久化存儲對象的序列化流等等。這些功能更為強大的流,都是在基本的流對象基礎…

S712001 開放式用戶通信

開放式用戶通信分類 TIA PORTAL 軟件內提供了以下指令: 不帶連接管理的通信指令 “TCON ” :建立以太網連接“TDISCON” :斷開以太網連接“TSEND” :TCP 和 ISO ON TCP 使用的發送數據“TRCV”: TCP 和 ISO ON TCP 使…

CSMatIO庫的安裝與C#實現.mat文件生成

一.CSMatIO介紹 CSMatIO 是一個用于讀寫 MATLAB .mat 文件的開源 C# 庫,它提供了簡單而高效的 API,使 .NET 應用程序能夠與 MATLAB 進行數據交換,支持讀取和寫入 MATLAB 的 .mat 文件(版本 5 和 7.3),兼容…

設計一個interface (一)

好的,我來舉一個具體的例子,幫助你理解 interface、element、resource 和 architecture 之間的關系。 場景:設計一個用戶管理系統的接口 背景 假設我們正在設計一個用戶管理系統,系統中有兩個主要的模塊: 用戶服務模…

tomcat下載安裝

目錄 一.tomact簡介 二.詳細步驟 三.下載頁面詳解(選看) 一.tomact簡介 Tomcat是Apache軟件基金會下的一個核心項目,它是一個開源的Java Servlet和JSP容器。由Apache、Sun等公司及個人共同開發,由于Sun的參與,最新的…

Axure版AntDesign 元件庫-免費版

AntDesign 元件庫概述 一、AntDesign 元件庫概述 添加圖片注釋,不超過 140 字(可選) AntDesign 是螞蟻集團推出的企業級設計體系,在 Axure 中使用 AntDesign 元件庫,可幫助設計師快速搭建符合現代企業級產品標準的高…

MySQL鎖機制全解析

MYSQL存儲引擎支持的鎖 InnoDB支持行級鎖(row-level locking)和表級鎖,默認為行級鎖。MyISAM采用表級鎖(table-level locking) 鎖的基本分類 1. 按照鎖的使用方式 , Mysql的鎖大致分為共享鎖和排它鎖 a. 共享鎖(S) 共享鎖,Share lock,又稱為讀鎖&am…

圖解Git中Rebase與Merge的區別

文章目錄 前言理解基本概念🔀 Git Merge:合并分支🔄 Git Rebase:重寫歷史 可視化理解工作流程實際應用場景與示例場景1:團隊協作 - 使用Merge場景2:個人分支整理 - 使用Rebase沖突解決:兩種策略…

2 Qt中的空窗口外觀設置和常用的基礎部件

Widget空窗口 this->setWindowTitle("我的窗口");//設置窗口標題this->resize(500,300);//設置窗口大小this->setFixedSize(500,300);//設置固定大小(無法拖拽) 此時,窗口大小發生改變,且窗口名稱改變&#x…

常用 Python 編輯器

可以使用任何文本編輯器來編寫 Python 程序,只要遵循 Python 語法且保存為文件,程序都可以通過 python 命令運行。不過,使用功能豐富的專用編輯器會帶來更好的編程體驗。 當今最常用的幾個 Python 編輯器(也稱 IDE 或代碼編輯器&a…

Java+Vue開發的電子采購管理系統,助力企業采購智能化,提升效率促發展

前言: 在當今數字化時代,企業采購管理面臨著提高效率、降低成本、增強透明度等諸多挑戰。傳統的采購模式往往存在流程繁瑣、信息傳遞不及時、管理難度大等問題。電子采購管理系統應運而生,它借助先進的互聯網技術和信息化手段,將…

嵌入式網絡通信與物聯網協議全解析:Wi-Fi、BLE、LoRa、ZigBee 實戰指南

來源:0voice/EmbeddedSoftwareLearn 一、為什么嵌入式一定要搞懂網絡通信? 在傳統的裸機或單機嵌入式項目里,我們習慣了“點燈、串口、IC/SPI、RTOS 多任務”這樣的套路。但當一個設備需要與云平臺、手機 App 或其他設備實時交互時&#xff…

【補充筆記●推薦方案】解決 Docker “open \.\pipe\docker_engine: Access is denied” 權限問題

starting services: initializing Docker API Proxy: setting up docker api proxy listener: open \\.\pipe\docker_engine: Access is denied.引言 【筆記】解決 WSL 遷移后 Docker 出現 “starting services: initializing Docker API Proxy: setting up docker ap” 問題-…

AI編程工具深度對比:騰訊云代碼助手CodeBuddy、Cursor與通義靈碼

騰訊云代碼助手 CodeBuddy 智能代碼補全:基于上下文和編輯行為預測代碼,支持行內補全、函數塊生成及注釋轉代碼,覆蓋200編程語言和框架,可減少70%以上的鍵盤輸入。Craft智能體:支持自然語言驅動的多文件協同開發&…

Redis 的集群

深入理解 Redis 的集群模式與高可用機制 Redis 是一款廣泛應用于高性能緩存與存儲系統的 NoSQL 數據庫。隨著業務的發展,如何提升 Redis 的高可用性和水平擴展能力成為架構設計的關鍵。本篇博客將系統講解 Redis 的不同集群模式及其高可用策略,深入剖析其…