进度设计
想要达到的效果
第一版进度设计
标注结果表
CREATE TABLE `data_result_580187` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`res` int(11) NOT NULL COMMENT '对应数据版本记录ID',
`vindex` int(11) NOT NULL COMMENT '文件序号',
`pindex` int(11) NOT NULL COMMENT '图片序号',
`width` int(11) NOT NULL COMMENT '图片宽度',
`height` int(11) NOT NULL COMMENT '图片高度',
`image_key` varchar(255) NOT NULL COMMENT '资源标识符',
`token` varchar(511) NOT NULL COMMENT '资源访问标识',
`result` mediumtext COMMENT '结果',
`secondary` int(11) DEFAULT '0' COMMENT '归属乙方ID',
`batch_index` int(11) DEFAULT '0' COMMENT '批次ID',
`cur_proc` int(11) DEFAULT '0' COMMENT '当前流程ID',
`proc_cnt` int(11) DEFAULT '0' COMMENT '流程轮数',
`step` int(11) DEFAULT '0' COMMENT '实际流程ID',
`handler` int(11) DEFAULT '0' COMMENT '流程操作人',
`status` tinyint(3) DEFAULT '0' COMMENT '流程数据状态',
`update_time` int(11) NOT NULL COMMENT '更新时间',
`ext` varchar(1024) DEFAULT '' COMMENT '添加附加信息',
PRIMARY KEY (`id`),
KEY `res_data_index` (`res`,`cur_proc`,`status`),
KEY `res_vidx_pidx` (`res`,`vindex`,`pindex`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
data_result_580187
存储的每个阶段图片的标注结果,cur_proc
一共有0,1,2,99四个值,分别代表标注、质检、抽查、验收四个阶段,status
标识该图片在该阶段有没有完成,于是第一版设计是基于的sql统计
原始进度查询语句
SELECT COUNT(DISTINCT(image_key)) as total FROM `$table` WHERE res=$res AND
(
(cur_proc =$seq AND status IN (1,2) and secondary=$secondary )
OR (cur_proc =$seq AND status =0 AND handler>0 and secondary in (0,$secondary) )
OR (cur_proc>$seq AND status in (0,1,2))
OR (status =2 )
)
问题
当列表的数据多,并且每个数据id的图片量很大的时候,实时的执行sql效率非常低,而且result表的image_key、cur_proc的标识度很低,索引基本上不起作用
第二版进度设计
针对第一版的出现问题的,我们优化出了第二版,即使用redis 的bitmap来标识每个阶段的图片是否标注完成
bitmap设计
图片映射索引
图片名 | 序号 |
---|---|
DMS_2019-11-20-18-46-15-486_1_IR_IR_5745.png | 1 |
DMS_2019-11-20-18-46-15-486_1_IR_IR_5750.png | 2 |
DMS_2019-11-20-18-46-15-486_1_IR_IR_6885.png | 3 |
DMS_2019-11-20-18-46-15-486_1_IR_IR_6890.png | 4 |
… | … |
bitmap key设计 pro_data_ver_images_{版本id}_{阶段序号}
bitmap 位序号:图片的序号
bitmap 位上的值:每个流程有两个状态值:0:未完成(未流转到下一流程);1:完成(已流转到下一流程)
在图片按批次流转的时候把对应阶段的状态重置,然后再统计出每个阶段已完成数量和未完成数量set到redis里,这种列表获取进度的时候都从redis里取就很快了