基於“與或”的多值狀態碼設計
阿新 • • 發佈:2018-11-03
使用背景
前段時間專案中需要跑批給使用者表增加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"的長度即可