原子操作是指不會被執行緒排程機制打斷的操作。這種操作一旦開始,就會一直執行到結束,中間不會有任何的執行緒切換。
分布式鎖本質上要實現的目標就是在redis裡面佔乙個坑,當別的執行緒也要來進行佔坑的時候,發現已經被別人占用了,只好放棄或者稍後重試。
佔坑使用setnx(set if not exists)指令。使用完成使用del指令釋放。
第一步
127.0.0.1:6379> setnx mylock true
(integer)
1
第二步
執行某些邏輯操作。
第三步
127.0.0.1:6379> del mylock
(integer)
1
在第二步執行邏輯的時候,如果發生異常,那麼釋放鎖的操作就不會被執行,就會造成死鎖。
在拿到鎖之後,給鎖設定乙個過期時間,保證出現異常的時候,鎖在一定時間之後自動釋放。
第一步
127.0.0.1:6379> setnx mylock true
(integer)
1
第二步
127.0.0.1:6379> expire mylock 10
(integer)
1
第三步
執行邏輯操作。
第四步
127.0.0.1:6379> del mylock
(integer)
1
如果在setnx和expire之間伺服器程序突然掛掉了,就會導致expire命令得不到執行,也會造成死鎖。根本原因在於setnx和expire是兩條指令而不是乙個原子指令。
在redis2.8版本中,作者加入了redis指令的擴充套件引數,使得setnx和expire指令可以一起執行,徹底解決了分布式鎖的亂象。
127.0.0.1:6379>
set mylock true ex 5 nx
ok
上面的指令就是setnx指令和expire指令組合在一起的原子指令。
redis分布式鎖不要用於較長時間的任務。
redis分布式鎖
redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...
Redis分布式鎖
分布式鎖一般有三種實現方式 1.資料庫樂觀鎖 2.基於redis的分布式鎖 3.基於zookeeper的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...
redis分布式鎖
使用redis的setnx命令實現分布式鎖 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多個客戶端對redis的連線並不存在競爭關係。redis的setnx命令可以方便的實現分布式鎖。setnx key value 將key的值設為value,當且僅當key不存在。如給定的...