9.8 KiB
9.8 KiB
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_libJOINbook_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 使用_bulkAPI
- 数据源:源库
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)
- 数据转换:
- 自定义
FlexInt64JSON 反序列化(兼容数字/字符串) - 自定义
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数字
- ID 类字段(
- 图片处理:从
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