本篇文章展示了redis實(shí)現(xiàn)分布式鎖的方法具體操作,代碼簡明扼要容易理解,絕對能讓你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
目前創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、鹿邑網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
分布式鎖其實(shí)可以理解為:控制分布式系統(tǒng)有序的去對共享資源進(jìn)行操作,通過互斥來保持一致性。
舉個(gè)不太恰當(dāng)?shù)睦樱杭僭O(shè)共享的資源就是一個(gè)房子,里面有各種書,分布式系統(tǒng)就是要進(jìn)屋看書的人,分布式鎖就是保證這個(gè)房子只有一個(gè)門并且一次只有一個(gè)人可以進(jìn),而且門只有一把鑰匙。
使用redis實(shí)現(xiàn)分布式鎖
使用redis命令 set key value NX EX max-lock-time 實(shí)現(xiàn)加鎖
使用redis命令 EVAL 實(shí)現(xiàn)解鎖
加鎖:
Jedis jedis = new Jedis("127.0.0.1", 6379); private static final String SUCCESS = "OK"; /** * 加鎖操作 * @param key 鎖標(biāo)識 * @param value 客戶端標(biāo)識 * @param timeOut 過期時(shí)間 */ public Boolean lock(String key,String value,Long timeOut){ String var1 = jedis.set(key,value,"NX","EX",timeOut); if(LOCK_SUCCESS.equals(var1)){ return true; } return false; }
解讀:
加鎖操作:jedis.set(key,value,"NX","EX",timeOut)【保證加鎖的原子操作】
key就是redis的key值作為鎖的標(biāo)識,value在這里作為客戶端的標(biāo)識,只有key-value都比配才有刪除鎖的權(quán)利【保證安全性】
通過timeOut設(shè)置過期時(shí)間保證不會(huì)出現(xiàn)死鎖【避免死鎖】
NX,EX什么意思?
NX:只有這個(gè)key不存才的時(shí)候才會(huì)進(jìn)行操作,if not exists;
EX:設(shè)置key的過期時(shí)間為秒,具體時(shí)間由第5個(gè)參數(shù)決定
解鎖
Jedis jedis = new Jedis("127.0.0.1", 6379); private static final Long UNLOCK_SUCCESS = 1L; /** * 解鎖操作 * @param key 鎖標(biāo)識 * @param value 客戶端標(biāo)識 * @return */ public static Boolean unLock(String key,String value){ String luaScript = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then return redis.call(\"del\",KEYS[1]) else return 0 end"; Object var2 = jedis.eval(luaScript,Collections.singletonList(key), Collections.singletonList(value)); if (UNLOCK_SUCCESS == var2) { return true; } return false; }
解讀:
luaScript 這個(gè)字符串是個(gè)lua腳本,代表的意思是如果根據(jù)key拿到的value跟傳入的value相同就執(zhí)行del,否則就返回0【保證安全性】
jedis.eval(String,list,list);這個(gè)命令就是去執(zhí)行l(wèi)ua腳本,KEYS的集合就是第二個(gè)參數(shù),ARGV的集合就是第三參數(shù)【保證解鎖的原子操作】
上述就實(shí)現(xiàn)了怎么使用redis去正確的實(shí)現(xiàn)分布式鎖,但是有個(gè)小缺陷就是鎖過期時(shí)間要設(shè)置為多少合適,這個(gè)其實(shí)還是需要去根據(jù)業(yè)務(wù)場景考量一下的。
看完上述內(nèi)容,你們掌握redis實(shí)現(xiàn)分布式鎖的方法的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
文章名稱:redis實(shí)現(xiàn)分布式鎖的方法
鏈接地址:http://vcdvsql.cn/article42/pdicec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、微信小程序、自適應(yīng)網(wǎng)站、網(wǎng)站導(dǎo)航、關(guān)鍵詞優(yōu)化、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)