一.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。對於這些鎖的實現這裡就不詳細介紹了,在使用過程中這些鎖鎖的是物件,在單伺服器...