setnx命令(set if not exists)
語法:setnx key value
功能:原子性操作,當且僅當 key 不存在,將 key 的值設為 value ,並返回1;若給定的 key 已經存在,則 setnx 不做任何動作,並返回0。
expire命令
語法:expire(key, expiretime)
功能:key設定過期時間
getset命令
語法:getset key value
功能:將給定 key 的值設為 value ,並返回 key 的舊值 (old value),當 key 存在但不是字串型別時,返回乙個錯誤,當key不存在時,返回nil。
get命令
語法:get key
功能:返回 key 所關聯的字串值,如果 key 不存在那麼返回特殊值 nil 。
del命令
語法:del key [key …]
功能:刪除給定的乙個或多個 key ,不存在的 key 會被忽略。
setnx(lockkey, 1) 如果返回0,則說明佔位失敗;如果返回1,則說明佔位成功
expire()命令對lockkey設定超時時間,為的是避免死鎖問題。
執行完業務**後,可以通過delete命令刪除key。
這個方案其實是可以解決日常工作中的需求的,但從技術方案的**上來說,可能還有一些可以完善的地方。比如,如果在第一步setnx執行成功後,在expire()命令執行成功前,發生了宕機的現象,那麼就依然會出現死鎖的問題
setnx(lockkey, 當前時間+過期超時時間) ,如果返回1,則獲取鎖成功;如果返回0則沒有獲取到鎖,轉向2。
get(lockkey)獲取值oldexpiretime ,並將這個value值與當前的系統時間進行比較,如果小於當前系統時間,則認為這個鎖已經超時,可以允許別的請求重新獲取,轉向3。
計算newexpiretime=當前時間+過期超時時間,然後getset(lockkey, newexpiretime) 會返回當前lockkey的值currentexpiretime。
判斷currentexpiretime與oldexpiretime 是否相等,如果相等,說明當前getset設定成功,獲取到了鎖。如果不相等,說明這個鎖又被別的請求獲取走了,那麼當前請求可以直接返回失敗,或者繼續重試。
在獲取到鎖之後,當前執行緒可以開始自己的業務處理,當處理完畢後,比較自己的處理時間和對於鎖設定的超時時間,如果小於鎖設定的超時時間,則直接執行delete釋放鎖;如果大於鎖設定的超時時間,則不需要再鎖進行處理。
importcn.com.tpig.cache.redis.redisservice;
import
cn.com.tpig.utils.springutils;
/*** created by idea
* user: shma1664
* date: 2016-08-16 14:01
* desc: redis分布式鎖 */
public
final
class
redislockutil
/*** 加鎖
* @param
key redis key
* @param
expire 過期時間,單位秒
* @return
true:加鎖成功,false,加鎖失敗
*/public
static
boolean lock(string key, int
expire)
return
false
; }
public
static
boolean
lock(string key)
/*** 加鎖
* @param
key redis key
* @param
expire 過期時間,單位秒
* @return
true:加鎖成功,false,加鎖失敗
*/public
static
boolean lock2(string key, int
expire)
long oldexpiretime = long.parselong(redisservice.get(key, "0"));
if(oldexpiretime }
return
false
; }
public
static
void
unlock1(string key)
public
static
void
unlock2(string key)
}}
publicvoid drawredpacket(long
userid) finally
} else
}
基於redis的分布式鎖
public class redislock 加鎖 取到鎖加鎖,並返回值用於解鎖 取不到鎖則立即返回 1 param millitimeout 最長鎖定時間,超時後自動刪除鎖,避免死鎖 return public synchronized long lock long millitimeout lo...
基於 Redis 的分布式鎖
分布式鎖在分布式應用中應用廣泛,想要搞懂乙個新事物首先得了解它的由來,這樣才能更加的理解甚至可以舉一反三。首先談到分布式鎖自然也就聯想到分布式應用。在我們將應用拆分為分布式應用之前的單機系統中,對一些併發場景讀取公共資源時如扣庫存,賣車票之類的需求可以簡單的使用同步或者是加鎖就可以實現。但是應用分布...
基於Redis的分布式鎖
the real target is that i was asked theredis鎖usage in the interview.and i cann t answer it.真正目的是因為在面試中被問到多執行緒這塊怎麼實現的,當時只是看了下 是用redis鎖實現的,至於具體的細節。自己回答的...