[TOC]
持久化就是把**內存的數據寫到磁盤中**,防止服務宕機導致內存數據丟失。
Redis 支持兩種方式的持久化,一種是`RDB`的方式,一種是`AOF`的方式。**前者會根據指定的規則定時將內存中的數據存儲在硬盤上**,而**后者在每次執行完命令后將命令記錄下來**。一般將兩者結合使用。
## RDB (Redis DataBase)
`RDB`是 Redis 默認的持久化方案。,在指定的時間間隔內將內存中的數據集快照寫入磁盤(在指定目錄下生成一個`dump.rdb`二進制文件)。Redis 重啟會加載`dump.rdb`文件恢復數據。
~~~text
save 3600 1
save 300 100
save 60 10000
~~~
### 執行過程
:-: 
* 執行`BGSAVE`命令
* Redis 父進程判斷當前**是否存在正在執行的子進程**,如果存在,`BGSAVE`命令直接返回。
* 父進程執行 `fork` 操作**創建子進程**,`fork` 操作過程中父進程會阻塞
* 父進程 `fork `完成后,**父進程繼續接收并處理客戶端的請求**,而子**進程開始將內存中的數據寫進硬盤的臨時文件**;
* 當子進程寫完所有數據后會**用該臨時文件替換舊的 RDB 文件**。
Redis 啟動時會讀取 RDB 快照文件,將數據從硬盤載入內存。通過 RDB 方式的持久化,,一旦 Redis 異常退出,就會丟失最近一次持久化以后更改的數據。
### 觸發機制:
1. **手動觸發**:執行`SAVE`或`BGSAVE`命令。`SAVE`命令執行快照的過程會阻塞所有客戶端的請求,應避免在生產環境使用此命令。`BGSAVE`命令可以在后臺異步進行快照操作,快照的同時服務器還可以繼續響應客戶端的請求,因此需要手動執行快照時推薦使用`BGSAVE`命令。
2. **被動觸發**:
* 根據配置規則進行自動快照,如`SAVE 100 10`,100 秒內至少有 10 個鍵被修改則進行快照。
* 如果從節點執行全量復制操作,主節點會自動執行 `BGSAVE` 生成 RDB 文件并發送給從節點。
* 默認情況下執行 `shutdown` 命令時,如果沒有開啟 AOF 持久化功能則自動執行`BGSAVE`。
* 執行 `flushall` 命令,也會觸發我們的rdb規則!
### 恢復數據
將 rdb 文件放在我們 redis 啟動目錄。redis 啟動時自動檢查 dump.rdb
### 優點
1. `Redis 加載 RDB 恢復數據遠遠快于 AOF 的方式`。
2. 使用**單獨子進程來進行持久化**,主進程不會進行任何 IO 操作,**保證了 Redis 的高效性**
### 缺點
1.** RDB 方式數據無法做到實時持久化**,因為 `BGSAVE` 每次運行都要執行 `fork` 操作創建子進程,屬于重量級操作,頻繁執行成本比較高。
2. RDB 文件使用特定二進制格式保存,Redis 版本升級過程中有多個格式的 RDB 版本,**存在老版本 Redis 無法兼容新版 RDB 格式的問題**。
## AOF(Append Only File)
AOF(append only file)持久化:以獨立日志的方式記錄每次寫命令,將Redis執行過的所有指令記錄下來(讀操作不記錄),只許追加文件 但不可以改寫文件,Redis 重啟時會重新執行 AOF 文件中的命令達到恢復數據的目的。
AOF 的**主要作用是解決了數據持久化的實時性**,AOF 是 Redis 持久化的主流方式。
默認情況下 Redis 沒有開啟 AOF 方式的持久化,可以通過`appendonly`參數啟用:
~~~
appendonly yes
~~~
開啟 AOF 方式持久化后每執行一條寫命令,Redis 就會將該命令寫進`aof_buf`緩沖區,AOF 緩沖區根據對應的策略向硬盤做同步操作。
默認情況下系統**每 30 秒**會執行一次同步操作。為了防止緩沖區數據丟失,可以在 Redis 寫入 AOF 文件后主動要求系統將緩沖區數據同步到硬盤上。可以通過`appendfsync`參數設置同步的時機
~~~
appendonly no # 默認是不開啟aof模式的,默認是使用rdb方式持久化的,在大部分所有的情況下,
rdb完全夠用!
appendfilename "appendonly.aof" # 持久化的文件的名字
# appendfsync always # 每次修改都會 sync。消耗性能
appendfsync everysec # 每秒執行一次 sync,可能會丟失這1s的數據!
# appendfsync no # 不執行 sync,這個時候操作系統自己同步數據,速度最快!
~~~
### 執行過程
:-: 
1. 所有的寫入命令會追加到 AOF 緩沖區中
2. AOF 緩沖區根據對應的策略向硬盤同步
3. 隨著 AOF 文件越來越大,需要定期對 AOF 文件進行重寫,達到壓縮文件體積的目的。AOF 文件重寫是把 Redis 進程內的數據轉化為寫命令同步到新 AOF 文件的過程。
4. 當 Redis 服務器重啟時,可以加載 AOF 文件進行數據恢復。
如果這個 aof 文件有錯位,這時候 redis 是啟動不起來的嗎,我們需要修復這個aof文件 redis 給我們提供了一個工具 `redis-check-aof --fix`
### 優點
1. AOF 可以更好的保護數據不丟失,可以配置 AOF 每秒執行一次`fsync`操作,如果 Redis 進程掛掉,最多丟失 1 秒的數據
2. AOF 以 `append-only` 的模式寫入,所以沒有磁盤尋址的開銷,寫入性能非常高。
### 缺點
1. 對于同一份文件 AOF 文件比 RDB 數據快照要大。
2. 數據恢復比較慢。
- PHP
- PHP 核心架構
- PHP 生命周期
- PHP-FPM 詳解
- PHP-FPM 配置優化
- PHP 命名空間和自動加載
- PHP 運行模式
- PHP 的 Buffer(緩沖區)
- php.ini 配置文件參數優化
- 常見面試題
- 常用函數
- 幾種排序算法
- PHP - 框架
- Laravel
- Laravel 生命周期
- ThinkPHP
- MySQL
- 常見問題
- MySQL 索引
- 事務
- 鎖機制
- Explain 使用分析
- MySQL 高性能優化規范
- UNION 與 UNION ALL
- MySQL報錯:sql_mode=only_full_group_by
- MySQL 默認的 sql_mode 詳解
- 正則表達式
- Redis
- Redis 知識
- 持久化
- 主從復制、哨兵、集群
- Redis 緩存擊穿、穿透、雪崩
- Redis 分布式鎖
- RedisBloom
- 網絡
- 計算機網絡模型
- TCP
- UDP
- HTTP
- HTTPS
- WebSocket
- 常見幾種網絡攻擊方式
- Nginx
- 狀態碼
- 配置文件
- Nginx 代理+負載均衡
- Nginx 緩存
- Nginx 優化
- Nginx 配置 SSL 證書
- Linux
- 常用命令
- Vim 常用操作命令
- Supervisor 進程管理
- CentOS與Ubuntu系統區別
- Java
- 消息隊列
- 運維
- RAID 磁盤陣列
- 邏輯分區管理 LVM
- 業務
- 標準通信接口設計
- 業務邏輯開發套路的三板斧
- 微信小程序登錄流程
- 7種Web實時消息推送方案
- 用戶簽到
- 用戶注冊-短信驗證碼
- SQLServer 刪除同一天用戶重復簽到
- 軟件研發完整流程
- 前端
- Redux
- 其他
- 百度云盤大文件下載
- 日常報錯記錄
- GIT
- SSL certificate problem: unable to get local issuer certificate
- NPM
- reason: connect ECONNREFUSED 127.0.0.1:31181
- SVN
- SVN客戶端無法連接SVN服務器,主機積極拒絕
- Python
- 基礎
- pyecharts圖表
- 對象
- 數據庫
- PySpark
- 多線程
- 正則
- Hadoop
- 概述
- HDFS