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 追加增量,子进程重写,原子替换。