基於Redis的分布式鎖

2022-04-01 10:17:37 字數 2573 閱讀 2949

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

import

cn.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)

}}

public

void 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鎖實現的,至於具體的細節。自己回答的...