# Go 文件功能说明 ## 项目概述 该项目是一个 **Go 批处理工具集**,主要用于数据同步和迁移任务,涉及 **MySQL**、**Elasticsearch** 和 **Redis** 之间的数据传输。 --- ## 文件列表与功能 ### 1. `main.go` — 项目入口(占位模板) - **位置**:根目录 - **作用**:GoLand 自动生成的默认入口文件,仅包含一个 `Hello, world` 打印程序。 - **说明**:不属于实际的批处理系统,可忽略或用作文档占位。 --- ### 2. `util/dbConnectUtil/dbConnectUtil.go` — 数据库连接工具包 - **位置**:`util/dbConnectUtil/` - **包名**:`dbConnectUtil` - **作用**:提供可复用的 MySQL 数据库连接初始化函数。 - **核心功能**: - `InitDB(username, password, host, port)` — 创建并测试 MySQL 连接 - 配置连接池参数(最大打开 20 个、最大空闲 10 个) - 返回全局变量 `DB`(`*sql.DB`) - **被依赖**:`shop_mysql_to_redis/` 下的两个子项目都导入此包。 --- ### 3. `addSyncSuitBook/main.go` — 图书数据同步工具 - **位置**:`addSyncSuitBook/` - **包名**:`main`(独立可执行程序) - **作用**:将源 MySQL 中的图书数据同步到目标 MySQL 和 Elasticsearch。 - **核心功能**: - **数据源**:源库 `book_lib` JOIN `book_lib_details`(IP: `36.134.185.139:6603`) - **目标 MySQL**:写入 `suit_book_lib_merged` 表(IP: `175.27.224.66:3306`) - **目标 ES**:写入 `books-from-mysql-v3` 索引(IP: `36.212.12.92:9527`) - **同步模式**:全量同步 / 增量同步(基于 `update_time` 记录上次同步时间到 `sync_state.json`) - **套装书标记**:查询 v2 索引中已存在的 ISBN,在 v3 索引中通过 script 更新 `is_suit = 1` - **执行计划**:程序启动时立即执行一次,之后每天凌晨 01:00 自动执行 - **批量操作**:MySQL 使用 `REPLACE INTO`;ES 使用 `_bulk` API --- ### 4. `addSyncPddReject/main.go` — 拼多多违规商品迁移工具 - **位置**:`addSyncPddReject/` - **包名**:`main`(独立可执行程序) - **作用**:将主库中因"涉嫌违规"被驳回的商品 ISBN 迁移到从库的过滤表中。 - **核心功能**: - **源库**:查 `shop_goods_rejection` 表(原因:`'您发布的商品涉嫌违规,请您检查相关商品并立即整改'`) - **目标库**:写入 `t_filter_set` 表(`limitation_type = '0'` 表示 ISBN 过滤) - **去重逻辑**:先查询目标表已有 ISBN,仅插入不重复的新数据 - **ID 生成**:雪花算法(Snowflake)生成 19 位分布式 ID - **批量插入**:每批 100 条,带进度打印 --- ### 5. `goods_es_to_redis/main.go` — ES 到 Redis 全量同步工具 - **位置**:`goods_es_to_redis/` - **包名**:`main`(独立可执行程序) - **作用**:从 Elasticsearch `books-from-mysql-v2` 索引全量拉取图书数据,写入 Redis DB 1。 - **核心功能**: - **数据读取**:使用 ES Scroll API 全量遍历(每批 10,000 条) - **并发模型**: - 8 个 ES 读取协程(m 并行处理 scroll 分页) - 1 个批处理协程(聚合成 500 条/批) - 32 个 Redis 写入协程(使用 Pipeline 批量 SET) - **数据转换**: - 自定义 `FlexInt64` JSON 反序列化(兼容数字/字符串) - 自定义 `StringOrArray` 类型(兼容字符串/数组) - 分类 ID 清洗:`A > B > C` → `A/B/C` - 出版时间时间戳转换 - 图片信息聚合(轮播图、白底图、详情图、目录图等) - **Redis 结构**:`key = ISBN`,`value = BookInfo JSON`(book_name/author/publisher/price/images/category 等) - **数据校验**:同步完成后用 SCAN 命令校验 Redis 中的 key 数量是否与 ES 文档数一致 - **进度报告**:每 5 秒打印一次同步进度 --- ### 6. `shop_mysql_to_redis/CameiCase/mysqlToRedisCameiCase.go` — 店铺数据迁移(驼峰版) - **位置**:`shop_mysql_to_redis/CameiCase/` - **包名**:`main`(独立可执行程序) - **作用**:将 MySQL 中的店铺相关数据迁移到 Redis,字段名为**驼峰命名**。 - **核心功能**: - **查询数据**:遍历 `t_shop_detail` 中的所有 `shop_id` - **关联表**: - `t_shop` — 店铺主表 - `t_shop_detail` — 店铺详情 - `t_shop_context` — 店铺上下文(商品描述) - `t_spec` — 规格设置 - `t_price_template` — 价格模板(根据 `sale_template_id` 关联) - **数据格式**: - 每条记录以 `{"source_table": "表名", "data": {字段: 值...}}` 格式存入 Redis - 字段名通过 `snakeToCamel()` 转为驼峰(如 `shop_id` → `shopId`) - 价格模板的 `rangePrice` 字段做浮点精度修复 - **Redis 结构**:`key = shopID`,`value = List`,每元素为一条 JSON 记录 - **数据库连接**:使用 `dbConnectUtil` 工具包 --- ### 7. `shop_mysql_to_redis/SanckCase/mysqlToRedis.go` — 店铺数据迁移(下划线版,优化版) - **位置**:`shop_mysql_to_redis/SanckCase/` - **包名**:`main`(独立可执行程序) - **作用**:与驼峰版类似,但字段名为**下划线命名**,且架构更完善。 - **增强功能**: - **并发处理**:3 个 Worker 并发处理店铺,每个店铺间 sleep 100ms 限流 - **循环执行**:每 5~10 分钟自动重跑(根据耗时动态调整间隔) - **优雅退出**:监听 `SIGINT`/`SIGTERM` 信号,打印运行次数后退出 - **字段标准化**(`normalizeFieldValue`): - ID 类字段(`id`, `*_id`, `create_by`, `update_by`)→ 字符串 - 时间字段(`create_time`, `update_time`, `add_time`, `expiration_time`)→ `"2006-01-02 15:04:05"` 格式 - `mall_id`、`district_id` 保持 `int64` 数字 - **图片处理**:从 `t_shop_img` 表查询图片,按 type 分类: - `type=1` → 水印图 - `type=3/4` → 详情首/尾图 - `type=5` → 末尾轮播图 - `type=7` → SKU 水印图 - **价格处理**: - `range_price` 字段做浮点精度修复 - `add_amount` 字段 `×100` 转为 `int64`(分单位) - **Redis 写入**:使用 Pipeline 批量操作(先 DEL 旧 key,再 RPUSH 所有记录) - **数据库连接**:使用 `dbConnectUtil` 工具包 --- ## 数据流向总图 ``` ┌─────────────────────────────────────────────────────────────┐ │ addSyncSuitBook │ │ MySQL (36.134.185.139:6603) │ │ book_lib + book_lib_details │ │ ┌──────────┴──────────┐ │ │ ▼ ▼ │ │ MySQL (175.27.224.66) ES (36.212.12.92:9527) │ │ suit_book_lib_merged books-from-mysql-v3 │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ addSyncPddReject │ │ MySQL Master (146.56.227.42:3306) │ │ shop_goods_rejection │ │ ▼ │ │ MySQL Slave (36.212.12.247:3306) │ │ t_filter_set │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ goods_es_to_redis │ │ ES (36.212.12.92:9527) │ │ books-from-mysql-v2 │ │ ▼ │ │ Redis (36.212.12.247:6379 DB 1) │ │ key=ISBN → BookInfo JSON │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ shop_mysql_to_redis │ │ MySQL (146.56.227.42:3306) │ │ t_shop / t_shop_detail / t_shop_context │ │ t_spec / t_price_template / t_shop_img │ │ ▼ │ │ Redis (CameiCase: 36.212.20.113:7963 DB 7) │ │ (SanckCase: 36.212.12.247:6379 DB 8) │ │ key=shopID → List of JSON records │ └─────────────────────────────────────────────────────────────┘ ``` ## 依赖关系 - `dbConnectUtil` 被 `shop_mysql_to_redis/` 下的两个子项目导入 - 所有可执行程序均为 `package main`,各自独立运行 - 外部依赖:`go-sql-driver/mysql`、`go-elasticsearch`、`go-redis`