Redis 分布式鎖

2021-10-11 21:32:18 字數 1233 閱讀 3827

原子操作是指不會被執行緒排程機制打斷的操作。這種操作一旦開始,就會一直執行到結束,中間不會有任何的執行緒切換。

分布式鎖本質上要實現的目標就是在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不存在。如給定的...