重複借款問題
解決方案:redis鎖
Talk is cheap,Show me the code 別BB,給我直接展示代碼
生成核心代碼
String creatOrderKey = "Loan:" + loanCreateReqDto.getUserId(); //鎖用戶id
Long currentTime = System.currentTimeMillis();
//userId放入redis false key之前已經存在,已加鎖 true 不存在 放入成功 加鎖成功
boolean lock = redisTemplate.opsForValue().setIfAbsent(creatOrderKey, currentTime);
try {
if (lock) {//加鎖成功
//校驗各種信息,生成借款訂單
logger.info("借款:結果:resultDto:{}",JSON.toJSONString(resultDto));
} else {//加鎖失敗
logger.info("任務已在進行中,,稍後再試");
}
} catch (Exception e) {
logger.info("借款異常 ", e);
} finally {
if (lock) {
redisTemplate.delete(creatOrderKey);
logger.info("任務結束,釋放鎖!");
} else {
logger.info("(當前線程)沒有獲取到鎖,無需釋放鎖!");
Long createTime = (Long) redisTemplate.opsForValue().get(creatOrderKey);
Long nowTime = System.currentTimeMillis();
Long time = (nowTime - createTime) / 1000;
if (time > 30l) {
logger.info("超過30秒,釋放鎖!");
redisTemplate.delete(creatOrderKey);
}
}
}
還款重複劃扣
鎖單,代碼邏輯同上
String orderno = repayVo.getOrderNo();
String key = "repay:" + orderno;
Long currentTime = System.currentTimeMillis();
boolean lock = redisTemplate.opsForValue().setIfAbsent(key, currentTime);
try {
if (lock) {
logger.info("還款邏輯處理 );
return xx;
}else{
logger.info("還款業務進行中");
return xx;
}
}catch (Exception e){
logger.error("還款:系統異常",e);
return xx;
}finally {
if (lock) {
redisTemplate.delete(key);
logger.info("還款:任務結束,釋放鎖!");
} else {
logger.info("還款:沒有獲取到鎖,無需釋放鎖!");
Long createTime = (Long) redisTemplate.opsForValue().get(key);
Long nowTime = System.currentTimeMillis();
Long time = (nowTime - createTime) / 1000;
if (time > 20l) {
redisTemplate.delete(key);
logger.info("還款:超過20秒,釋放鎖!");
}
}
}