使用redis實現分布式鎖

2021-09-21 02:08:02 字數 1925 閱讀 3129

一.redis命令講解:

setnx()命令:

setnx的含義就是set if not exists,其主要有兩個引數 setnx(key, value)。

該方法是原子的,如果key不存在,則設定當前key成功,返回1;如果當前key已經存在,則設定當前key失敗,返回0。

get()命令:

get(key) 獲取key的值,如果存在,則返回;如果不存在,則返回nil;

getset()命令:

這個命令主要有兩個引數 getset(key, newvalue)。該方法是原子的,對key設定newvalue這個值,並且返回key原來的舊值。

假設key原來是不存在的,那麼多次執行這個命令,會出現下邊的效果:

1. getset(key, "value1")  返回nil   此時key的值會被設定為value1

2. getset(key, "value2")  返回value1   此時key的值會被設定為value2

3. 依次類推!

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

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

具體**如下:

實現分布式鎖distributedlockhandler類:

package tk.mybatis.springboot.distributedlock;

import org.springframework.stereotype.service;

import redis.clients.jedis.jedis;

@service("distributedlockhandler")

public class distributedlockhandler else else }}

return result;

} catch (exception e)

}/**

* 釋放鎖

* @param lockkey 鎖的名字

*/public void realselock(string lockkey)

}/**

* 內部獲取鎖的實現方法

* @param lockkey 鎖的名字

* @return

*/private boolean innertrylock(string lockkey) else

}return false;}}

/*** 判斷加鎖是否超時

* @param currenttime 當前時間

* @param lockkey 鎖的名字

* @return

*/private boolean checkiflocktimeout(long currenttime, string lockkey) else

}public distributedlockhandler setjedis(jedis jedis)

}呼叫demo類:

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...

使用Redis實現分布式鎖

網上大部分建議都是使用setnx,這個本身沒有什麼問題,因為低版本的redis中,只有這個命令可以互斥的set乙個key。但是隨著redis版本的公升高,提供了更多的命令來更好的滿足我們的需求。set keyvalue ex seconds px milliseconds nx xx 這可和你所知道...

使用redis 實現分布式鎖

在有些需要高可用的場景中,保證併發量的情況下需要使用分布式鎖來做控制,保證應用的可靠性。我們知道jdk提供了一些常用的鎖比如reentrantlock,reentrantreadwritelock,synchronized。對於這些鎖的實現這裡就不詳細介紹了,在使用過程中這些鎖鎖的是物件,在單伺服器...