應對高並發場景的redis加鎖技巧


// 獲取鎖
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")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM