// 獲取鎖
getLock() {
// 是否有正在執行的線程
boolean hasLock = false;
try {
hasLock = redisClient.setnx("lockKey", "ing") == 1;
if (hasLock) {
redisClient.expire("lockKey", 60*60);//一小時
}
} catch (Exception e) {
logger.error("redis.lock.setnx is error", e);
// 避免成功獲取到鎖,但是未成功設置過期時間
redisClient.expire("lockKey", 60*60);//一小時
}
reutrn hasLock;
}
//釋放鎖
releaseLock() {
redisClient.del("lockKey");
}
//調用入口
doMethod() {
if(!getLock()) {
//未獲取到鎖
return "不允許調用";
}
//獲取到鎖,開始處理
try{
//業務邏輯執行
return "處理成功";
} finally {
// 只要獲取到鎖,則在業務邏輯結束之后,必須釋放鎖
releaseLock();
}
return "異常";
}
redisClient.setnx 時,將value設置為某個時間戳,然后可以通過一個job去定時校驗是否需要釋放該鎖,或者在getLock之前加一步操作,get("lockKey")到時間戳,檢查是否需要釋放鎖,然后del("lockkey")
