基於redis的setnx()、get()、getset()方法 分布式鎖解讀


一.redis命令講解:

setex()命令:

SETEX key seconds value

將值 value 關聯到 key ,並將 key 的生存時間設為 seconds (以秒為單位)。

如果 key 已經存在, SETEX 命令將覆寫舊值。

這個命令類似於以下兩個命令:

SET key value
EXPIRE key seconds  # 設置生存時間
不同之處是, SETEX 是一個原子性(atomic)操作,關聯值和設置生存時間兩個動作會在同一時間內完成,該命令在 Redis 用作緩存時,非常實用。

可用版本:
>= 2.0.0
時間復雜度:
O(1)
返回值:
設置成功時返回 OK 。
當 seconds 參數不合法時,返回一個錯誤。

 

setnx()命令:

SETNX key value

將 key 的值設為 value ,當且僅當 key 不存在。

若給定的 key 已經存在,則 SETNX 不做任何動作。

SETNX 是『SET if Not eXists』(如果不存在,則 SET)的簡寫。

可用版本:
>= 1.0.0
時間復雜度:
O(1)
返回值:
設置成功,返回 1 。
設置失敗,返回 0 。

 

get()命令:

GET key

返回 key 所關聯的字符串值。

如果 key 不存在那么返回特殊值 nil 。

假如 key 儲存的值不是字符串類型,返回一個錯誤,因為 GET 只能用於處理字符串值。

可用版本:
>= 1.0.0
時間復雜度:
O(1)
返回值:
當 key 不存在時,返回 nil ,否則,返回 key 的值。
如果 key 不是字符串類型,那么返回一個錯誤。

 

getset()命令:

GETSET key value

將給定 key 的值設為 value ,並返回 key 的舊值(old value)。

當 key 存在但不是字符串類型時,返回一個錯誤。

可用版本:
>= 1.0.0
時間復雜度:
O(1)
返回值:
返回給定 key 的舊值。
當 key 沒有舊值時,也即是, key 不存在時,返回 nil 。

 

 

二.具體的使用步驟如下:

     1. setnx(lockkey, 當前時間+過期超時時間) ,如果返回1,則獲取鎖成功;如果返回0則沒有獲取到鎖,轉向2。
     2. get(lockkey)獲取值oldExpireTime ,並將這個value值與當前的系統時間進行比較,如果小於當前系統時間,則認為這個鎖已經超時,可以允許別的請求重新獲取,轉向3。
     3. 計算newExpireTime=當前時間+過期超時時間,然后getset(lockkey, newExpireTime) 會返回當前lockkey的值currentExpireTime。
     4. 判斷currentExpireTime與oldExpireTime 是否相等,如果相等,說明當前getset設置成功,獲取到了鎖。如果不相等,說明這個鎖又被別的請求獲取走了,那么當前請求可以直接返回失敗,或者繼續重試。
     5. 在獲取到鎖之后,當前線程可以開始自己的業務處理,當處理完畢后,比較自己的處理時間和對於鎖設置的超時時間,如果小於鎖設置的超時時間,則直接執行delete釋放鎖;如果大於鎖設置的超時時間,則不需要再鎖進行處理。 

 

 


免責聲明!

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



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