最近在做demo的時候,碰到這麼一個問題:當頁面上同一角色有兩個人登錄的時候,他們同時操作統一條記錄; 簡言之就是,同一記錄同一時刻多人操作。這種情況在我的業務中回導致數據的冗餘,干擾正常的程序運行。
當時想到的解決辦是鎖表或者使用緩存(當然其他的方式可以在下方留言探討~),鎖表沒有嘗試過所以自然就想到了緩存。
實現思路是,當頁面端用戶選中記錄並且進行操作的時候,在服務端先不進行業務處理,而是先使用緩存,判斷緩存中是否存在該業務單的操作信息,若果有則直接返回頁面端,提示用戶當前記錄正在辦理;如果沒有則新增存入該條業務的操作信息,(操作信息的格式自定,注意唯一性),然後進行業務邏輯處理,處理完成(包含異常)之後進行緩存中操作信息的刪除,到這裏就大公告成。
(如果是集羣分佈式,注意緩存的共享~~)
初步嘗試,歡迎各位的指正!
如下是一部分代碼的內容:
public boolean doRedisLock(List<String> idList,String LockFlag,String cacheName){
boolean islockSuccess = true;
//防止多人人重複操作
Map cache = CacheManager.getCache(cacheName);
List<String> tempLockIdsList = new ArrayList<>();
for (String idTemp : idList) {
//判斷當前記錄是否已經正在辦理或者已經辦理
String nowStatus = (String) cache.get(idTemp+LockFlag);
if(nowStatus == null){//如果當前的緩存中存在該記錄的操作,繼續遍歷
tempLockIdsList.add(idTemp);
//先將已經遍歷的未被他人操作的記錄進行鎖定,期間不准他人操作
cache.put(idTemp+cacheName,cacheName);//先將該記錄的業務新增至緩存
}else{//存在已經在辦理的記錄
//將預先鎖定的記錄解除鎖定,清除緩存
for(String tempLockId: tempLockIdsList){
cache.remove(tempLockId+cacheName);
}
islockSuccess = false ;
}
}
return islockSuccess;
}