业务场景
码头货单审核系统,系统注册了多家货运公司,每个公司的货物每天都需要审核,所以就有了这么一个货单审核系统。每个审核员账号都绑定很N个货运公司,审核员每天要审核货单,我们提供了一个货单审核页面,大致如图:
QQ截图.png
功能要求
- 该页面查询审核员绑定的货运公司近三天的所有订单。
- 30秒自动刷新一次页面。
初始逻辑
- 新建一张审核单表(order_examine),包含审核单主要字段。
- 添加一个查询状态枚举字段【 0:待审核 】【1:待重审】 【2:审核通过】 【3:审核失败】。
- 当审核单进入待审核、待重审、审核通过、审核失败相关流程方法时,将查询字段改为相应的状态值。
- 当进行审核列表分页查询的时候,构建4条SQL去查询该账号绑定的货运公司各个状态的审核单数量。
初始方案缺陷
由于审核单表(order_examine)存放的是列表查询核心数据,承载的查询压力很大,如果每次分页查询需要执行6个SQL(查询状态数量查询:4条,订单分页数据查询:1条,订单总数查询:1条),这样设计就容易导致查询超时,数据库崩溃。
优化方案
1.减轻订单主表查询压力,将数量查询操作分离出来。
2.新建一张货运公司查询状态订单计数表(company_query_status_count),通过公司ID、待审核订单数、待重审订单数、审核通过订单数、审核失败订单数、日期(yyyy-MM-dd)、订单数作为计数逻辑字段,该表只存3天数据。
3.利用公司ID作为分布式锁机制进行状态变更计数操作,并将结果更新至DB。
4.查询逻辑:直接通过公司ID、日期查计数表进行数量统计。
5.设置定时任务:每天凌晨5点对3天前的数据做删除处理。
计数逻辑细节
(1) 因为订单查询状态有 待审核 、待重审 、 审核通过 、审核失败,所以状态变换的时候会有旧状态和新状态,订单计数只需要对旧状态-1和新状态+1计数就可以了。
(2) 新建一个无查询状态的枚举,用于新订单进入的时候作为旧状态,无统计逻辑。
(3) 每天第一条新单进入的时候,会初始化一条计数数据。
网友评论