實現分布式鎖的方式有很多:
1) zookeeper
2)redis
3)阿里開源等。。。
但是在redis中進行實現鎖的網上百分之99的案例中,都如下 。
long i = jedis.setnx(key, key);
if(i ==
1) else
} 這個是這裡在setnx之後還沒來得及設定過期時間就宕機了,這樣會導致deadlock
正確的做法應該是:
string result = jedis.set(redislock, randomuuid, set_if_not_exist, set_with_expire_time, timeout);
127.0.0.1:7180> set key value [ex seconds] [px milliseconds] [nx|xx]
publicclass
redistool
return
false
; }
}
解鎖的時候,有人會進行
jedis.del() // 這種做法也是不可以的。
每乙個人都會進行刪除對應的鎖。
publicstatic
void
wrongreleaselock2(jedis jedis, string lockkey, string requestid)
}
正確做法如下:
publicclass
redistool
return
false
; }
}
參考:
Redis分布式鎖的正確實現方式
分布式鎖一般有三種實現方式 1.資料庫樂觀鎖 2.基於redis的分布式鎖 3.基於zookeeper的分布式鎖。為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 1.互斥性。在任意時刻,只有乙個客戶端能持有鎖。2.不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能...
Redis分布式鎖的正確實現方式
首先,set 加入了nx引數,可以保證如果已有key存在,則函式不會呼叫成功,也就是只有乙個客戶端能持有鎖,滿足互斥性。其次,由於我們對鎖設定了過期時間,即使鎖的持有者後續發生崩潰而沒有解鎖,鎖也會因為到了過期時間而自動解鎖 即key被刪除 不會發生死鎖。最後,因為我們將value賦值為reques...
Redis 分布式鎖的實現方式
分布式鎖一般有三種實現方式 資料庫樂觀鎖 基於redis的分布式鎖 基於zookeeper的分布式鎖 加鎖 public class redistool return false 可以看到,我們加鎖就一行 jedis.set string key,string value,string n stri...