基于“与或”的多值状态码设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010430495/article/details/81356240

使用背景

       前段时间项目中需要跑批给用户表增加A、B、C信息(ABC分别代表不同的字段),这些信息是通过外部网站爬虫获取的,然而这些外部网站由于IP限制、QPS限制导致调用的失败率很高,因此需要为每一个字段添加成功状态信息。

实现目标:

  1. 减少索引字段
  2. 执行效率高
  3. 扩展性强

实现方法

       只用一个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"的长度即可

猜你喜欢

转载自blog.csdn.net/u010430495/article/details/81356240