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