背景
现在的项目做的是与某书对接的业务,使用三方的SDK,由于使用的是三方服务,所以业务中无法避免各种网络的IO(这里吐槽下老外的文档写的真的是混乱不堪 - -!)。
由于实时的数据存储在三方的数据库中,既有的定时任务是每天将实时数据同步到我们自己的数据库中去。但是随着项目的扩展以天为周期的同步任务已经无法满足既有业务的需求了。
因此新的需求是根据每10分钟的操作记录将更新后的最新的数据同步到我们自己本地的数据库中去。
实现这个需求的基本思路就是:根据SDK提供的方法获取所有账户在10分钟的操作记录的原始数据,然后再将这些源数据构建成合适的数据结构,最后存储到我们自己的数据库中。
中间构建数据的耗时可以忽略不计——平时刷了那么多题相信你对自己程序的时间复杂度与空间复杂度会有很好的掌控。
这个需求最需要优化的地方就是使用SDK获取原始数据的网络IO操作与将数据写入或更新本地数据库的操作。
处理SDK的问题我使用的是线程池;写入或更新数据使用ON DUPLICATE KEY UPDATE(注意这个语法只能在MySQL中执行)。
demo项目
我这边做了一个demo,项目的目录结构如下:
db_demo
├── config.py
├── db_conn.py
├── log.py
├── logs
│ └── my_log.log
├── run.py
└── utils.py
项目概述
config.py里面存放配置信息;db_conn.py封装了pymysql的操作;log.py封装了日志模块;utils.py里面有模拟IO耗时的函数与处理IO操作的函数;run.py是项目的启动文件,里面包含了普通方法与并发方法的对比。
数据库准备
记得在本地数据库中创建一个students的数据库,里面新建一个student表,表结构下:
注意这里我使用class_id做主键!这很重要!我们自己的数据库也没有使用id做主键,而是选用了其他的字段!
代码
# -*- coding:utf-8 -*- MySQLS = { 'student': { 'host': '127.0.0.1', 'user': 'root', 'password': '123', 'db': 'students', 'port': 3306, 'charset': 'utf8' } }