1. 程式人生 > >基於“與或”的多值狀態碼設計

基於“與或”的多值狀態碼設計

使用背景

       前段時間專案中需要跑批給使用者表增加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"的長度即可