3. 业务数据库基础:关系型数据库(MySQL)与非关系型数据库(Redis)的典型架构与数据模型

在构建倒排索引与业务数据库的一致性保障方案之前,必须深入理解两类核心业务数据库的底层架构与数据模型。MySQL 作为关系型数据库的代表,提供了强事务与结构化存储;Redis 作为非关系型数据库的代表,提供了高性能缓存与键值存储。两者的架构差异直接决定了数据同步策略的设计边界。

3.1 关系型数据库(MySQL)典型架构

MySQL 采用经典的客户端-服务器架构,核心组件包括连接层、SQL 层、存储引擎层与物理文件层。以下架构图展示了 MySQL 的内部模块与请求处理流程。

MySQL 典型架构(客户端-服务器-存储引擎) 客户端 / 连接池 连接管理 / 线程复用 SQL 层 查询解析 → 优化 → 执行计划 存储引擎层(可插拔) InnoDB | MyISAM | Memory | NDB Buffer Pool 数据页 / 索引页缓存 Redo Log / Undo Log 事务持久化 / 回滚 磁盘文件(.ibd / .frm) 表空间 / 数据文件 主从复制(Binlog → Relay Log) 异步 / 半同步 / 组复制
架构要点:MySQL 的 SQL 层与存储引擎层分离设计,使得 InnoDB 成为默认引擎后,事务、行锁、MVCC 等能力与倒排索引的变更日志(Binlog)紧密耦合。一致性保障方案必须关注 Binlog 的捕获时机与存储引擎的提交顺序。

3.2 MySQL 数据模型:关系、表与索引

MySQL 的数据模型基于关系代数,核心概念包括:

  • 表(Table):行与列的集合,每行代表一条记录,每列代表一个属性。
  • 主键(Primary Key):唯一标识一行,InnoDB 默认使用聚簇索引组织数据。
  • 二级索引(Secondary Index):非聚簇索引,叶子节点存储主键值,回表查询。
  • 外键(Foreign Key):维护表间引用完整性,但会降低写入性能。
概念 说明 与倒排索引的关系
聚簇索引 数据行与索引页物理连续存储 变更时需同步更新倒排索引的文档 ID 映射
二级索引 独立 B+ 树,叶子存主键值 倒排索引可视为特殊的二级索引
事务(ACID) 原子性、一致性、隔离性、持久性 倒排索引更新需与业务事务保持最终一致
Binlog 记录所有数据变更的二进制日志 倒排索引同步的核心数据源
实践提示:在一致性保障方案中,MySQL 的 Binlog 通常以 Row 格式记录,确保每条 INSERT/UPDATE/DELETE 操作都能精确映射到倒排索引的文档变更。建议开启 Binlog 的完整镜像(full-image)以避免数据丢失。

3.3 非关系型数据库(Redis)典型架构

Redis 采用单线程事件循环 + 多数据类型的内存存储架构,强调极低延迟与高吞吐。以下架构图展示了 Redis 的核心模块与持久化策略。

Redis 典型架构(内存存储 + 持久化 + 复制) 客户端(Jedis / Lettuce) 网络层(Reactor 模型) 单线程事件循环引擎 命令队列 → 执行 → 响应 数据类型:String | Hash | List | Set | Sorted Set | Stream 每种类型对应不同的底层编码(ziplist / skiplist / dict) RDB(快照) 定时全量持久化 AOF(追加日志) 每写命令追加 / 重写 主从复制 / 哨兵 / 集群
架构要点:Redis 的单线程模型避免了并发竞争,但持久化(RDB/AOF)与主从复制可能引入数据不一致窗口。在倒排索引场景中,Redis 通常作为缓存层或二级索引加速层,其数据一致性依赖于与 MySQL 的同步策略。

3.4 Redis 数据模型:键值、哈希与有序集合

Redis 的数据模型以键(Key)为入口,支持多种数据结构。在倒排索引一致性场景中,最常用的类型包括:

  • String:存储单个值,适合缓存文档内容或计数器。
  • Hash:存储字段-值映射,适合表示文档的多个属性。
  • Sorted Set:带权重的有序集合,适合存储倒排索引的 term → docID 列表及权重。
  • Stream:消息队列,适合作为变更事件的缓冲通道。
数据类型 底层编码 倒排索引应用场景 一致性关注点
String int / embstr / raw 缓存文档 ID 到内容的映射 过期时间与 MySQL 数据同步
Hash ziplist / hashtable 存储文档的字段级属性 字段更新时需同步倒排索引
Sorted Set ziplist / skiplist term → docID 列表 + 权重排序 增删文档时需原子更新集合
Stream listpack / rax 变更事件缓冲,供消费者同步 消息确认与重试机制
一致性风险:Redis 默认不提供强一致性。当使用 Sorted Set 存储倒排索引时,若 Redis 宕机且未及时持久化,可能导致索引数据丢失。建议结合 AOF 的 everysec 策略与定期 RDB 快照,降低数据丢失窗口。

3.5 MySQL 与 Redis 的架构对比

下表从多个维度对比两种数据库的架构特性,为后续一致性方案设计提供决策依据。

维度 MySQL(InnoDB) Redis
存储介质 磁盘(Buffer Pool 缓存) 内存(磁盘持久化辅助)
数据模型 关系型(表、行、列) 键值型(多种数据结构)
事务支持 ACID 事务(MVCC + Redo Log) Lua 脚本原子性,无回滚
一致性模型 强一致(主从异步可能弱一致) 最终一致(主从异步)
变更捕获 Binlog(Row / Statement / Mixed) 无原生变更日志,需 Keyspace Notification
典型延迟 1~10ms(磁盘 I/O 影响) <1ms(内存操作)
扩展方式 读写分离 / 分库分表 主从复制 / 集群分片
设计启示:在倒排索引一致性方案中,MySQL 作为权威数据源(Source of Truth),Redis 作为加速缓存或二级索引。变更数据捕获(CDC)应基于 MySQL 的 Binlog,而 Redis 的更新应作为异步消费端,通过 Stream 或消息队列实现解耦。