一.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釋放鎖;如果大於鎖設置的超時時間,則不需要再鎖進行處理。