MySQL MVCC 的快照讀和當前讀區別
快照讀 (Snapshot Read)
定義: 讀取數據的歷史版本(快照),基于 MVCC(多版本并發控制)實現。 特點: 不加鎖,非阻塞讀。 返回事務開始時的快照數據,確保一致性。 依賴 Undo Log 和版本鏈。 適用場景: 普通的 SELECT 查詢。 示例:
SELECT * FROM user WHERE id = 1 ;
隔離級別: Read Committed(讀已提交) 和 Repeatable Read(可重復讀) 中常用。
當前讀 (Current Read)
定義: 讀取數據的最新版本,通常涉及加鎖。 特點: 加鎖操作,保證數據一致性。 返回最新提交的數據。 使用行鎖、間隙鎖等機制。 適用場景: 加鎖查詢或寫操作(如 UPDATE、DELETE)。 示例:
SELECT * FROM user WHERE id = 1 FOR UPDATE ;
UPDATE user SET name = 'Tom' WHERE id = 1 ;
主要區別
特性 快照讀 當前讀 數據版本 歷史快照 最新數據 是否加鎖 不加鎖 加鎖 實現方式 MVCC + Undo Log 鎖 + 最新數據 示例 普通 SELECT 加鎖 SELECT, DML
Redis RDB + AOF 混合持久化流程
Redis 在 4.0 版本引入了 RDB 和 AOF 的混合持久化,結合 RDB 的快速恢復和 AOF 的數據完整性。以下是流程:
1. 開啟混合持久化
aof-use-rdb-preamble yes
2. 數據寫入
客戶端寫命令(如 SET、DEL)被記錄到 AOF 緩沖區。
3. 觸發重寫
手動觸發: BGREWRITEAOF 命令。 自動觸發: 根據 AOF 文件大小增長規則。
4. 混合持久化過程
生成 RDB 快照: 寫入 AOF 文件: 追加增量命令: 子進程生成快照期間,主進程緩沖寫命令。 快照完成后,將緩沖區的命令以 AOF 格式追加到文件。 替換舊文件: 新 AOF 文件(RDB + AOF 增量)原子替換舊文件。
5. 數據恢復
重啟時: 加載 AOF 文件中的 RDB 部分,快速恢復內存。 執行后續 AOF 命令,補齊增量變更。
配置示例
save 900 1
appendonly yes
aof-use-rdb-preamble yes
優點
RDB: 文件小,恢復快。 AOF: 數據丟失少。 混合: 兼顧速度和完整性。
總結
MySQL MVCC: Redis 混合持久化: RDB 提供初始快照,AOF 追加增量,子進程重寫,原子替換。