进度设计

想要达到的效果

在这里插入图片描述

第一版进度设计

标注结果表

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里取就很快了

参考

Redis中BitMap的用法
一看就懂系列之 详解redis的bitmap在亿级项目中的应用

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐