场景
数据同步只能通过php脚本拉取三方接口来执行。比如我需要每天拉取从jd商城下单的数据到mysql,jd通过已知接口告知我共多少页多少条数据。大概每天60w条,但是问题是jd接口请求频次受限。而用php请求还有个问题就是脚本可能超时或者由于其他原因异常退出。这样会导致数据插入失败,甚至是插入重复。
实现思路
- 通过接口查询当天总条数(假设在获取过程中数据变化可控)
- 根据对方接口频次限制需求及自身机器性能,算出每页多少条可以查询(即插入)
- mysql插入采用n条数据采用batch方式,缩短事务频次及语法解析频次等
- 分段插入,插入成功后用redis设置offset,防止对方及自身进程异常退出
- 在程序入口判断offset值,是否需要从断点处开始或者从1开始,或者是已经插入完成。
php简单代码实现(ci框架)
|
|
其他问题
- 需要尽量提升mysql innodb引擎的性能
- 代码是基于ci_2.0,ci_2.0的insert_battch有个小bug,返回的affect_rows最大是100..
- 注意php的内存限制及执行环境