版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010430495/article/details/81356240
使用背景
前段时间项目中需要跑批给用户表增加A、B、C信息(ABC分别代表不同的字段),这些信息是通过外部网站爬虫获取的,然而这些外部网站由于IP限制、QPS限制导致调用的失败率很高,因此需要为每一个字段添加成功状态信息。
实现目标:
- 减少索引字段
- 执行效率高
- 扩展性强
实现方法
只用一个int类型的state表示状态信息,并且以每一个二进制位表示每一个字段的成功状态。如下图:
每次查询只查询state<0b111也就是state<7的数据,对查询出来的进行以下操作
private static final int STATE_A=0b001; private static final int STATE_B=0b010; private static final int STATE_C=0b100; private static final int STATE_COMPLETE=0b111;//如果新增字段只需要对此字段增加位 @Test public void testState(){ List<User> userList = this.queryUnCompleteUsers(); userList.forEach(user -> { int state=user.getState(); //001和state”与“操作如果不等于001说明第一位值不是1,代表a没有被执行 if((state&STATE_A)!=STATE_A){ //说明a没有执行 try { String a = getA(); user.setA(a); //执行成功,001和state“或”操作,执行结果state的第一位必是1,记录a已经被执行 state|=STATE_A; } catch (Exception e) { //失败不修改状态码,下次继续查 } } if((state&STATE_B)!=STATE_B){ //说明b没有执行 try { String b = getB(); user.setB(b); state|=STATE_B; } catch (Exception e) { } } if((state&STATE_C)!=STATE_C){ //说明c没有执行 try { String c = getC(); user.setC(c); state|=STATE_C; } catch (Exception e) { } } user.setState(state); }); this.batchUpdate(userList); }
总结:
1、state单字段表示了n个字段的状态,减少索引
2、int类型的<查询也提高查询效率;“&”提高判断效率;“|”提高状态码修改效率
3、如果新增字段的话,只需要修改增加"STATE_COMPLETE"的长度即可