Redis分布式鎖比較正確的姿勢是采用redisson這個客戶端工具。
可重入鎖(Reentrant Lock)
基于Redis的Redisson分布式可重入鎖RLock。
public class DemoMain {
public static void main(String[] args) throws Exception {
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);
RLock lock = redisson.getLock("anyLock");
lock.lock();
...
//lock.unlock();
}
}
問題分析 Redisson節(jié)點宕機&鎖續(xù)期
鎖超時-節(jié)點宕機
如果負責存儲分布式的Redisson節(jié)點宕機,而且這個鎖正好處于上鎖的狀態(tài)時,那么就會出現(xiàn)我們所謂的死鎖的狀態(tài)。但是為了避免這種情況的發(fā)生,Redisson內(nèi)部已經(jīng)提供了一種機制??赏ㄟ^Redisson通過加鎖的方式提供了leaseTime的參數(shù)來指定加鎖的時間,超過這個時間這個鎖就自動解開了。
鎖續(xù)期-節(jié)點宕機
Redisson內(nèi)部已經(jīng)提供了一種機制,LockWatchDog(看門狗) 即提供了一個監(jiān)控鎖的看門狗,它的作用是在Redisson實例被關閉前,不斷的延長鎖的有效期。默認情況下,看門狗檢查鎖超時時間的間隔為30秒,這個時間可通過Config.lockWatchDogTimeout來進行指定。
Redisson.create(config);

通過源碼:internalLockLeaseTime 和 lockWatchdogTimeout這兩個參數(shù)是相等的.
lockWatchdogTimeout默認值如下
public class Config {
private long lockWatchdogTimeout = 30 * 1000;
public long getLockWatchdogTimeout() {
return lockWatchdogTimeout;
}
//...
}
internalLockLeaseTime:分布式鎖的超時時間默認是30秒.
看門狗,多久來延長一次有效期呢?

即:獲取鎖成功就會開啟一個定時任務,也就是watchdog,定時任務會定期檢查去續(xù)期renewExpirationAsync(threadId).
這里定時用的是netty-common包中的HashedWheelTimer,該定時調(diào)度每次調(diào)用的時間差是internalLockLeaseTime / 3.也就10秒.
總結(jié)
默認情況下,加鎖的時間是30秒.如果加鎖的業(yè)務沒有執(zhí)行完,那么到 30-10 = 20秒的時候,就會進行一次續(xù)期,把鎖重置成30秒.那這個時候可能又有同學問了,那業(yè)務的機器萬一宕機了呢?宕機了定時任務跑不了,就續(xù)不了期,那自然30秒之后鎖就解開了.
注:內(nèi)容總結(jié)于肥朝微信公眾號,在此只是當做學習筆記-非原創(chuàng)