Oracle 实时同步到 Doris 怎么做?全量迁移、CDC 增量复制与数据校验指南

Oracle 承载交易数据,Apache Doris 承载实时分析,是企业构建实时数仓时常见的异构数据链路。真正落地时,团队通常需要同时解决四个问题:如何把 Oracle 存量数据完整迁移到 Doris,如何持续捕获新增、更新和删除,如何处理两端数据类型与表模型差异,以及如何证明同步后的数据一致。

NineData 数据复制支持 Oracle 到 Doris 的结构复制、全量复制和增量复制。本文以一条完整的生产链路为例,说明准备条件、任务配置、CDC 原理、类型映射、监控和数据校验方法。

|-------------------------------------------------------------------------------------------------|
| 核心方案:先通过结构复制和全量复制建立 Doris 基线,再由增量复制读取 Oracle 日志并持续写入 Doris;任务追平后,通过全量或快速数据对比叠加增量数据对比,持续检查两端一致性。 |

一、Oracle 到 Doris 实时同步的整体链路

一条典型链路可以拆成四个阶段:

  1. 结构准备:将 Oracle 表结构转换为 Doris 可接收的结构,配置目标表名、Key 和 Distribute Key。
  2. 全量复制:读取 Oracle 已有数据,并行写入 Doris,建立目标端数据基线。
  3. CDC 增量复制:从 Oracle 日志中捕获 INSERT、UPDATE、DELETE 等变化,持续同步到 Doris。
  4. 数据校验:全量阶段完成或增量任务追平后,对源端和目标端执行一致性对比;任务持续运行期间,再校验新增、更新和删除记录。

这种方式适合以下场景:

  • 将 Oracle 业务库中的订单、客户、库存等数据实时同步到 Doris,供 BI、报表和即席分析使用;
  • Oracle 数据库迁移或下线前,先完成存量迁移,再保持增量数据持续追平;
  • 建设实时数仓,降低分析查询对 Oracle 生产库的影响;
  • 将分散在多个 Oracle Schema 中的数据汇聚到 Doris。

二、开始前必须满足的产品条件

NineData Oracle 到 Doris 链路创建任务前应确认以下条件。

1. 支持的 Oracle 源端版本

NineData 当前支持以下 Oracle 版本作为该链路的源端:

  • Oracle 23ai
  • Oracle 21c
  • Oracle 19c
  • Oracle 18c
  • Oracle 12c
  • Oracle 11g

目标端数据源类型为 Doris。Doris 的具体版本兼容性以 NineData 控制台创建数据源时的提示和最新更新为准;

2. Oracle 与 Doris 已添加到 NineData

在 NineData 控制台进入「数据源管理 > 数据源」,分别创建 Oracle 和 Doris 数据源。

Oracle 支持通过公网地址、NineData 网关或 SSH Tunnel 接入。连接信息包括 Oracle 地址、端口、SID 或 Service Name、数据库账号和密码。添加公网或自建环境中的 Oracle 时,需要将 NineData 对应接入地域的服务器 IP 加入 Oracle 白名单。

Doris 数据源需要填写 FE 节点的地址和端口。用于数据复制时,建议继续添加可访问的 BE 节点:NineData 可以直接向 BE 写入,提高数据导入效率;如果不配置 BE,也可以通过 FE 写入,但速度会较慢BE 节点配置使用主机名或 IP 及心跳端口,默认端口为 8040。

两端都应先执行「连接测试」,确认成功后再创建数据源。

3. 数据库账号权限

不同复制阶段的权限要求不同:

|------|--------------------------------------------------------------------|-------------|
| 复制类型 | Oracle 源端权限 | Doris 目标端权限 |
| 结构复制 | CONNECT、SELECT ANY DICTIONARY、SELECT ANY TABLE、SELECT_CATALOG_ROLE | 目标数据库的全部权限 |
| 全量复制 | CONNECT、SELECT ANY DICTIONARY、SELECT ANY TABLE、SELECT_CATALOG_ROLE | 目标数据库的全部权限 |
| 增量复制 | 需要指定一个 DBA 权限用户,用于 Oracle 为源的增量数据复制任务 | 目标数据库的全部权限 |

生产环境应使用专门的同步账号,不要复用个人账号。账号授权应按照组织安全流程执行,并限制来源网络。Oracle 12c 及以上的 CDB/PDB 环境还要正确处理公共账号和容器权限,具体授权语句以 NineData 当前链路要求及企业 Oracle 架构为准。

4. Oracle 必须开启归档日志与附加日志

NineData 的 Oracle CDC 增量复制依赖源端日志。创建增量任务前,先检查日志模式和附加日志:

|------------------------------------------------------------------------------------------------|
| SQL SELECT log_mode FROM vdatabase; SELECT supplemental_log_data_all AS allc FROM vdatabase; |

预期结果如下:

  • LOG_MODE 为 ARCHIVELOG;
  • SUPPLEMENTAL_LOG_DATA_ALL 为 YES。

如果 Oracle 当前为 NOARCHIVELOG,需要先按照 Oracle 的标准流程切换到 ARCHIVELOG。该操作涉及实例状态与归档空间规划,应在维护窗口由 DBA 完成。

如果附加日志未开启,可以执行:

|-------------------------------------------------------------|
| SQL ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; |

附加日志使 CDC 能够获得可靠的行定位和变更信息。开启后还应评估 redo 和归档日志增长量、磁盘容量及清理策略。

5. 每张同步表应具有主键或唯一约束

NineData 要求同步对象中的每张表具有主键或唯一约束,并保证列名唯一。缺少稳定的唯一标识时,增量更新和删除难以准确定位目标记录,可能造成重复同步或数据不一致。

在建任务前建议先盘点无主键表,对查询结果逐表评估:优先补充业务主键或唯一约束;无法补充时,不应在未验证的情况下直接纳入实时同步。

6. 对象名称必须符合 Doris 规则

Oracle 源端的库表名称需要符合 Doris 命名规则:以字母开头,只包含字母、数字和下划线,不能包含空格或其他特殊字符。

对于不符合规则的对象,可在 NineData 的映射配置中修改目标表名或使用批量规则统一转换。创建任务时也可以选择目标对象命名规则:全部转小写、保持与源一致或全部转大写。

三、在 NineData 中创建 Oracle 到 Doris 复制任务

登录 NineData 控制台,进入「数据复制 > 数据复制」,单击「创建复制」。

步骤 1:选择 Oracle 源端与 Doris 目标端

在「数据源与目标」页面配置:

  • 任务名称:使用便于识别的名称,例如 oracle_order_to_doris_realtime;
  • 源数据源:已录入的 Oracle;
  • 目标数据源:已录入的 Doris;
  • 目标对象命名规则:根据 Doris 现有规范选择大小写转换;
  • 复制类型:根据场景选择结构复制、全量复制和增量复制;
  • 复制规格:根据数据量、业务窗口和期望速度选择。

首次建设实时链路时,通常选择「结构复制 + 全量复制 + 增量复制」。这会先创建目标结构并迁移历史数据,然后持续同步 Oracle 日志中的变化。

如果 Doris 已由数仓团队提前建表,可以不选择结构复制,但目标库中的表名、列名必须与复制对象一致,或在后续步骤中手动建立映射。

步骤 2:设置增量开始时间

包含增量复制时,可以选择:

  • 从启动时间开始:以任务启动时间为增量起点;
  • 自定义时间:按业务时区选择历史时间点。

使用自定义历史时间时,要确保所需归档日志仍然可用。NineData 要求:如果起点早于任务创建时间,而该时间段内发生过 DDL,复制任务可能失败。因此,选择历史位点前应核对日志保留时间和 DDL 变更记录。

步骤 3:明确目标端存量与冲突处理策略

NineData 会根据所选复制类型展示不同策略。

目标库同名对象处理策略用于结构复制:

  • 预检查报错并停止任务;
  • 跳过并继续任务;
  • 删除对象并重建。

目标表存量数据处理策略用于全量复制:

  • 预检查报错并停止任务;
  • 忽略目标存量数据,追加写入;
  • 清空目标存量数据,重新写入。

目标表增量数据冲突处理策略用于增量复制:

  • 运行时报错,等待人工处理;
  • 不更新目标数据,跳过冲突并继续;
  • 更新目标数据,以源端变更覆盖目标端数据。

生产任务不应机械选择"覆盖"。如果 Doris 只作为 Oracle 的下游分析副本,通常应禁止业务直接修改目标表,再根据企业对一致性和连续性的优先级选择"报错"或"更新目标数据"。

步骤 4:选择复制对象

NineData 支持两种方式:

  • 全部实例:复制源端可选的全部内容;
  • 自定义对象:按 Schema 和表选择需要同步的对象。

生产实时数仓更建议使用自定义对象,只同步分析真正需要的表和字段,降低 Oracle 日志读取、网络和 Doris 写入压力。

如果需要批量创建多条相似链路,可以下载复制对象配置模板,通过 Excel 批量定义源表、目标表、源库、目标库、字段列表和额外配置,再上传导入。额外配置支持字段映射、目标字段类型、字段取值以及行级过滤条件。

步骤 5:配置 Oracle 到 Doris 的映射

在「配置映射」页面,需要重点检查以下内容:

  • 目标数据库和目标表名称;
  • Oracle 列名到 Doris 列名的映射;
  • Oracle 类型到 Doris 类型的转换结果;
  • Doris 目标表的 Key;
  • Doris 目标表的 Distribute Key;
  • 是否需要字段过滤或行过滤。

NineData 允许单击「映射与过滤」调整目标字段名和数据过滤条件。例如设置:

|--------------------------------|
| Plain Text ORDER_ID >= 100000 |

仅符合条件的数据会写入 Doris。过滤条件应先在 Oracle 侧验证语义与执行成本,避免对源库造成意外压力。

对于大量表,可以使用「批量配置」统一处理表名、字段名大小写、前后缀和字符串替换。源端或目标端结构在配置期间发生变化时,应单击「刷新元数据」重新获取结构。

步骤 6:为 CDC 选择正确的 Doris 表模型

Doris 的表模型决定相同 Key 的多条记录如何保存。Oracle→Doris 链路包含 UPDATE 和 DELETE 时,表模型不能只按照查询性能选择,还要保证目标端能够表达源端变更语义。

|---------------|-----------------------------------------------|-------------------------------------------------------------------------------------------|-----------------------|
| Doris 表模型 | 相同 Key 数据的处理方式 | 对 Oracle CDC 的影响 | 典型用途 |
| Duplicate Key | 保留明细数据,不对相同 Key 自动去重或聚合 | Oracle UPDATE 如果以新版本行写入,旧版本可能仍然存在;DELETE 也不能仅依赖追加一行自然消除旧记录。若要保存"当前状态",需确认同步链路能够执行目标端更新和删除 | 原始明细、事件流、允许多版本记录的事实数据 |
| Aggregate Key | 相同 Key 的 Value 列按 SUM、MAX、MIN、REPLACE 等聚合方式合并 | 写入语义会被聚合函数改变,不天然等价于 Oracle 行级 UPDATE/DELETE;需要按指标模型设计并验证回撤或删除行为 | 预聚合指标、汇总报表 |
| Unique Key | 以 Key 保持逻辑唯一,新写入记录更新同 Key 的当前值 | 更接近 Oracle 主键表的"最新状态"语义,通常是承接行级 UPDATE/DELETE 的优先评估对象;仍需验证删除事件、部分列更新和乱序变更 | 订单、客户、库存等需要保留最新状态的表 |

如果目标是构建 Oracle 业务表的实时镜像,通常先评估 Unique Key 模型,并让 Doris Key 与 Oracle 主键或稳定唯一键一致。Duplicate Key 更适合保留所有事件或明细版本,Aggregate Key 更适合已经明确聚合口径的指标表。

上线前可以针对目标 Doris 版本、表模型和 NineData 写入路径,实际执行以下测试:

  1. 插入一个新主键,确认 Doris 只出现一条记录;
  2. 连续更新同一主键,确认最终值与 Oracle 一致且没有多版本重复;
  3. 删除该主键,确认 Doris 查询结果不再返回该记录;
  4. 对同一主键快速执行多次更新,验证事务顺序和最终状态;
  5. 在全量复制进行期间更新或删除记录,确认全量与增量衔接没有覆盖新值或复活已删除记录。

NineData 的 Oracle→Doris 配置映射页面支持配置目标表 Key 和 Distribute Key。Key 负责数据模型语义,Distribute Key 影响数据分布与写入/查询热点。两者都应以 Oracle 主键分布、表规模和主要查询条件为依据评审,避免使用高倾斜列作为分桶键。

四、Oracle 数据类型如何映射到 Doris

异构同步不能只关注"数据是否写入",还要确认精度和语义是否保持。NineData支持的主要类型映射如下:

|---------------------------------------------------------|----------|
| Oracle 类型 | Doris 类型 |
| CHAR、NCHAR | CHAR |
| VARCHAR2、NVARCHAR2 | VARCHAR |
| CLOB、NCLOB、LONG | STRING |
| NUMBER、DECIMAL | DECIMAL |
| BINARY_FLOAT | FLOAT |
| BINARY_DOUBLE | DOUBLE |
| DATE、TIMESTAMP | DATETIME |
| TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE | DATETIME |
| INTERVAL YEAR TO MONTH、INTERVAL DAY TO SECOND | VARCHAR |
| RAW | VARCHAR |
| BLOB、BFILE、LONG RAW | STRING |
| ROWID、UROWID | VARCHAR |

长度和精度会根据源字段定义生成。映射成功不等于业务语义一定一致,建议对关键字段单独设计验证用例。

五、保存任务并执行预检查

完成映射后,单击「保存并预检查」。Oracle 到 Doris 链路的预检查包含:

  • 源数据源连接检查;
  • 目标数据源连接检查;
  • Oracle 源端账号权限检查;
  • Doris 目标端账号权限检查;
  • Oracle 是否为 ARCHIVELOG;
  • Oracle 是否开启 Supplemental Log (ALL);
  • Doris 目标表是否已有数据;
  • Doris 是否存在同名对象;
  • 对象名称是否符合 Doris 命名规范。

检查失败时,进入对应检查项的「详情」查看原因,修复后单击「重新检查」。警告项可以结合实际情况决定是否处理,但涉及权限、日志模式、对象命名和目标存量数据的警告,应明确风险后再继续。

预检查通过后,单击「启动任务」。NineData 会按照结构复制、全量复制、增量复制的顺序执行所选阶段。

六、全量迁移期间如何降低业务影响

全量复制会持续读取 Oracle 并向 Doris 写入。数据量较大时,应提前评估两端性能,并尽量在业务低峰期启动。

NineData 在任务详情的「全量复制」页签展示进度、日志和监控指标。全量复制过程中可以使用「限流设置」,按行/秒限制写入 Doris 的速率。实际限流值应结合以下指标逐步调整:

  • Oracle CPU、I/O、会话数与查询响应时间;
  • 网络带宽与丢包;
  • Doris FE/BE 负载、导入响应时间和 compaction 压力;
  • NineData 全量复制吞吐和预计完成时间。

如果追求更高写入效率,确认 NineData 到 Doris BE 节点的网络连通性,并在 Doris 数据源中配置多个可访问的 BE 节点。

七、CDC 增量复制如何运行和监控

全量阶段建立基线后,NineData 增量复制持续读取 Oracle 日志,将变更写入 Doris。任务详情会展示同步延迟和增量复制监控。

增量阶段建议重点关注:

  • 同步延迟:显示 Oracle 与 Doris 之间的数据延迟;0 秒表示当前已追平;
  • 执行线程:查看线程号、当前执行 SQL、提交响应时间、事件时间和状态;
  • 写入限流:按行/秒限制增量写入速度;
  • 任务日志:排查权限、日志缺失、数据冲突和目标写入异常;
  • 告警:任务失败时按已配置的通知方式发送告警。

当提交响应时间持续升高或延迟不断累积时,应分别检查 Oracle 日志产生速度、归档可用性、网络、NineData 规格以及 Doris 写入和 compaction 状态,而不是只在目标端盲目扩容。

NineData 对部分增量任务提供同步位点管理,可以查看或修改读取位点和写入位点。修改位点会暂停并重启任务,错误调整可能导致数据丢失或两端不一致。该功能只应在完成备份、明确影响范围且具备回滚方案的维护窗口使用,已完成增量复制的任务不能重置位点。

八、如何校验 Oracle 与 Doris 数据一致性

仅看到任务"运行中"或延迟为 0 秒,为了确保数据完全一致,建议生产链路中同步完成至少一次基线校验,并对后续 CDC 变化持续抽查或对比。

1. 在复制任务中开启数据一致性对比

创建任务的预检查页面可以勾选「开启数据一致性对比」。不同任务的启动时机为:

  • 仅结构复制:结构复制完成后;
  • 结构复制 + 全量复制:全量复制完成后;
  • 仅全量复制:全量复制完成后;
  • 包含增量复制:增量数据首次追平源端且延迟为 0 秒时。

任务启动后,也可以进入复制详情的「数据对比」页签手动开启。

2. 全量数据对比与快速对比怎么选

该条数据链路,NineData 数据对比提供两种主要方式:

  • 全量数据对比:对所选数据进行完整对比,适合割接前的最终确认和核心表校验;
  • 快速对比:对比记录总数、数值列的最大值/最小值/平均值,并按设定比例随机抽样,适合大规模任务的快速巡检。

数据对比支持设置并发数、是否分片、单分片大小、FLOAT/DOUBLE 精度、大字段是否参与对比以及字符串空格处理策略。大表可以启用分片并行,但应根据 Oracle 和 Doris 的负载逐步提高并发。

3. 如何控制数据校验对源库的影响

全量数据对比会读取所选范围的数据。表越大、并发越高、分片越多,通常完成越快,但对 Oracle 的 CPU、I/O、Buffer Cache、会话和网络压力也越大。生产环境建议采用以下顺序:

  1. 先用快速对比覆盖全部同步表,定位记录数和统计值异常;
  2. 对核心表、异常表和割接范围执行全量数据对比;
  3. 大表开启分片前,先用低并发和较大的单分片进行基线测试;
  4. 在业务低峰期逐步提高并发,同时观察 Oracle AWR/ASH、I/O、活动会话和业务 SQL 响应时间;
  5. 根据需要关闭大字段对比,或把大字段表拆到独立任务;
  6. 对 FLOAT/DOUBLE 设置符合业务容差的精度,避免把浮点表达差异误判为业务不一致;
  7. 实时链路稳定后启用增量对比,减少重复扫描历史数据。

对比任务的并发数和单分片大小没有适用于所有环境的固定值。应使用生产等规模数据压测,并以不突破源库资源水位和业务 SLA 为前提调优。

4. 数据对比

Oracle → Doris 链路支持全量数据对比,可用于校验迁移后两端的数据一致性。

使用条件包括:

  • 复制任务包含全量复制;
  • 待对比表具有主键、唯一键或可用于定位记录的普通索引。

在复制任务详情进入「数据对比」,选择全量对比执行校验。注意:该链路暂时不支持增量对比,无法对 CDC 产生的新增、更新、删除记录进行持续校验,可以关注产品的持续迭代和更新进度。

5. 如何处理不一致

对比结果不一致时,可以查看:

  • 记录在 Oracle 和 Doris 中是否存在;
  • 用于定位记录的主键、唯一键或索引;
  • 两端字段值;
  • 差异记录数。

差异明细可以下载为 JSON 或 Excel。文件可能包含敏感业务数据,应按照企业的数据安全制度保存和传输。

NineData 可以根据差异生成变更 SQL。页面最多展示 1000 条差异,全部语句可通过变更文件下载。变更 SQL 会直接修改目标数据,不能未经审核批量执行。对于同一主键的数据差异,可能需要先删除错误记录再插入正确记录;执行前应检查目标、条件、顺序和事务策略,完成后重新对比确认结果恢复一致。

九、迁移割接前的检查清单

当 Oracle 到 Doris 用于正式迁移或分析流量切换时,建议至少完成以下检查:

  1. Oracle 与 Doris 数据源连接稳定,白名单和网关配置符合生产要求;
  2. Oracle 版本在支持范围内,源端已开启 ARCHIVELOG 和 Supplemental Log (ALL);
  3. 所有同步表具有主键或唯一约束,列名唯一;
  4. 表名、列名符合 Doris 规则,Key 和 Distribute Key 已评审;
  5. 金额、时间、大字段和特殊类型的映射已经过边界值验证;
  6. 目标端存量数据和增量冲突策略已经明确;
  7. 全量复制完成,失败对象为零,相关日志无未处理异常;
  8. 增量复制持续运行并追平,延迟稳定为 0 秒或满足业务 SLA;
  9. 全量或快速数据对比完成,核心表结果一致;
  10. 增量数据对比已覆盖真实的 INSERT、UPDATE、DELETE 测试;
  11. 任务失败告警、归档日志保留、Doris 容量和应急处理方案已经配置;
  12. 如果涉及业务切换,已准备回退方案,并冻结或严格管理切换窗口内的 DDL。

十、常见问题

Oracle 到 Doris 可以只做一次全量迁移吗?

可以。创建任务时选择结构复制和/或全量复制,不选择增量复制即可。如果需要 Oracle 后续变化持续进入 Doris,则应选择增量复制,并提前开启 Oracle 归档日志和附加日志。

CDC 是否需要在 Oracle 表上增加时间戳字段?

不需要依赖业务时间戳字段轮询。NineData 的 Oracle 增量复制基于源端日志捕获变化。但同步表仍应具有主键或唯一约束,以可靠定位更新和删除记录。

为什么 Oracle 开启了 ARCHIVELOG,预检查仍然失败?

除 ARCHIVELOG 外,还要确认 SUPPLEMENTAL_LOG_DATA_ALL 为 YES,同步账号权限满足要求,且 NineData 能访问相应 Oracle 实例。可以从预检查详情查看具体失败项。

Doris 是否必须配置 BE 节点?

不是必须。NineData 可以通过 FE 写入 Doris,但官方文档说明配置 BE 后可以直接向 BE 写入,效率更高,并建议添加所有可正常访问的 BE 节点。

增量延迟为 0 秒是否代表数据一定一致?

不代表。延迟为 0 秒表示消费进度已追平,不等于所有记录和值都已验证一致。还需要开启全量或快速数据对比,并根据需要启用增量数据对比。

Oracle 表没有主键还能同步吗?

NineData 官方 Oracle→Doris 链路要求同步对象中的每张表具有主键或唯一约束,否则可能重复同步数据。生产任务应先补充稳定的唯一标识,再执行增量复制。

同步期间 Oracle 发生 DDL 怎么办?

使用早于任务启动时间的自定义增量起点时,如果所选时间段发生 DDL,官方文档提示任务可能失败。生产环境应管理 DDL 变更窗口,并在结构调整后检查任务状态、目标表结构和数据一致性。

总结

Oracle 实时同步到 Doris 不是简单的数据导入,而是一条由结构转换、全量基线、日志 CDC、持续监控和一致性校验组成的完整链路。

NineData 已提供 Oracle→Doris 的专属数据复制能力:支持 Oracle 23ai、21c、19c、18c、12c 和 11g,能够执行结构复制、全量复制和增量复制;在任务配置中可以完成对象选择、字段映射、行过滤、Doris Key 与 Distribute Key 配置、目标存量和增量冲突策略;任务运行后可以监控同步延迟、线程、日志与写入速率,并通过全量、快速和增量数据对比验证迁移质量。

生产落地的关键顺序是:先确认版本、权限、网络、主键和日志条件,再配置映射与冲突策略;全量完成后等待 CDC 追平,最后用数据对比验证结果。只有复制进度、增量延迟和数据一致性同时满足要求,才具备进入正式分析或迁移割接阶段的条件。

相关推荐
码流子2 小时前
高速场景视频接入:GB/T 28181 级联与 RTSP 取流,一条链路讲清楚
大数据·数据库·人工智能·物联网·音视频
m0_752035632 小时前
Redis 数据结构总结
数据结构·数据库·redis
oradh2 小时前
Oracle SQL性能优化案例----数据入库和更新任务
sql·oracle·性能优化
iCxhust2 小时前
51单片机电力载波应用开发(九)51产品化
c语言·数据库·嵌入式硬件·mysql·51单片机·软件工程·c51
tryxr2 小时前
如何分析一个慢sql
数据库·sql·mysql·慢sql
泡海椒2 小时前
JQuickExcel 大文件排障与调优:从实际路径定位 OOM、临时盘和慢任务
开发语言·数据库·缓存·oracle·excel
java_logo3 小时前
Docker 部署 MariaDB:轻松搭建开源关系型数据库
数据库·docker·容器·开源·mariadb·轩辕镜像·docker部署教程
tryxr3 小时前
什么情况下索引会失效
数据库·mysql·索引失效·索引
guo_wen_qiang3 小时前
redis持久化
数据库·redis·分布式