基于redis方式實(shí)現(xiàn)分布式鎖_第1頁(yè)
基于redis方式實(shí)現(xiàn)分布式鎖_第2頁(yè)
基于redis方式實(shí)現(xiàn)分布式鎖_第3頁(yè)
基于redis方式實(shí)現(xiàn)分布式鎖_第4頁(yè)
基于redis方式實(shí)現(xiàn)分布式鎖_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Redis的分布式分布式鎖一般有三種實(shí)現(xiàn)方Redis的分布式分布式鎖一般有三種實(shí)現(xiàn)方ZooKeeper的分布式基于關(guān)系數(shù)據(jù)庫(kù)樂(lè)觀基于關(guān)系數(shù)據(jù)庫(kù)實(shí)現(xiàn)分布式鎖主要利用數(shù)據(jù)庫(kù)的鎖機(jī)制,通常使用樂(lè)觀鎖。但是由于并發(fā)場(chǎng)景下RDBMS的IO開銷太大,所以一般不適用與大型、高并發(fā)項(xiàng)目ZooKeeper基于ooeper臨時(shí)有序節(jié)點(diǎn)實(shí)現(xiàn)的分布式鎖,其大致思想為:每個(gè)客戶端獲取鎖時(shí),在ookeperzkhpblo.csdnne/heopcRedis的分布式本篇主要介紹使用redis構(gòu)建分布式鎖服redis實(shí)現(xiàn)分布式鎖主要Redissetnx命SETNXkeyvalrediskey不存在時(shí),setkeyvalkey存在,則什么都不做,返回0expirekeykeysecondredis會(huì)自動(dòng)刪除該鍵值對(duì),即鎖rediskey,即釋放在使用Redisrediskey,即釋放在使用Redis實(shí)現(xiàn)分布式鎖的時(shí)候,主要就會(huì)使用到這三個(gè)命令1、獲取鎖的時(shí)候setnx加鎖,并使expire命令為鎖添加一個(gè)超時(shí)時(shí)間,超過(guò)該時(shí)間則自動(dòng)釋放鎖,鎖的value值需要指定,可以根據(jù)具有業(yè)務(wù)含義,本文簡(jiǎn)化為UUID,在2、獲取鎖的時(shí)候還設(shè)置一個(gè)獲取的超時(shí)時(shí)間,若超過(guò)這個(gè)時(shí)間則放棄獲取鎖3、釋放鎖的時(shí)候,通過(guò)UUID判斷是不是該鎖,若是該鎖,則執(zhí)行delete進(jìn)行鎖釋放Maven依賴信packagecom.zpc.redis.lock;importredis.clients.jedis.Jedis;importjava.util.UUID;publicclassRedisLockprivateJedisPoolpublicRedisLock(JedisPoolprivateJedisPoolpublicRedisLock(JedisPool{this.jedisPool=}*@param@param@parampublicStringlock(StringlockKey,LongacquireTimeout,Long{Jedisconn=StringreturnedLockId=tryconn=StringlockName="redis_lock_"+3.定義上鎖成功之后,鎖的超時(shí)時(shí)間intexpireTimeinttimeOutStringlockId=UUID.randomUUID().toString().replaceAll("-",//LongendTime=System.currentTimeMillis()+acquireTimeout;while(System.currentTimeMillis()<endTime){6.使用setnxif(conn.setnx(lockName,lockId)==1)conn.expire(lockName,expireTime);returnreturnedLockId;}//}}catch(Exception{}finallyif(conn!=packageimportcom.zpc.redis.lock.RedisLock;packageimportcom.zpc.redis.lock.RedisLock;import}}return}*publicbooleanreleaseLock(StringlockKey,StringlockId)Jedisconn=null;try{conn=StringlockName="redis_lock_"+3.如果valueredisifflag=true;System.out.println("releaselock:"+}}catch(Exception{}finallyif(conn!={}}return}importpublicclassRedisLockDemoprivatestaticJedisPoolimportpublicclassRedisLockDemoprivatestaticJedisPoolstaticJedisPoolConfigconfig=new//////config.setMaxWaitMillis(1000*//pool=newJedisPool(config,"",6379,}privatestaticRedisLockredisLock=newpublicstaticvoidmain(String[]{for(inti=0;i<50;i++)}}}classThreadRedisextendsThreadprivateRedisLock{this.redisLock=}publicvoidrun()try{identifier=redisLock.lock("foodLock",3000L,1000*60*redis測(cè)試,控制redis測(cè)試,控制臺(tái)輸出如下,發(fā)現(xiàn)超過(guò)3s鐘獲取鎖失敗Thread-46獲取鎖成功,id執(zhí)行業(yè)務(wù)邏輯releaseThread-46釋放鎖成功,idThread-40獲取鎖成功,id執(zhí)行業(yè)務(wù)邏輯releaseThread-40釋放鎖成功,idThread-19獲取鎖成功,id執(zhí)行業(yè)務(wù)邏輯releaseThread-19釋放鎖成功,idThread-49獲取鎖成功,idif(StringUtils.isEmpty(identifier))//}System.out.println(Thread.currentThread().getName"獲取鎖成功,鎖ididentifier:Thread.sleep(300);//模擬業(yè)務(wù)處理耗}catch(Exceptione)}finally//if(!StringUtils.isEmpty(identifier))if(releaseLock){System.out.println(Thread.currentThread().getName"釋放鎖成功,鎖ididentifier:identifier+}}}}}執(zhí)行業(yè)務(wù)邏輯release執(zhí)行業(yè)務(wù)邏輯releaseThread-49釋放鎖成功,idThread-13獲取鎖成功,id執(zhí)行業(yè)務(wù)邏輯releaseThread-13釋放鎖成功,idThread-20獲取鎖成功,id執(zhí)行業(yè)務(wù)邏輯releaseThread-20釋放鎖成功,idThread-1獲取鎖成功,id執(zhí)行業(yè)務(wù)邏輯releaseThread-1釋放鎖成功,idThread-22獲取鎖成功,id執(zhí)行業(yè)務(wù)邏輯releaseThread-22釋放鎖成功,idThread-33獲取鎖成功,id執(zhí)行業(yè)務(wù)邏輯releaseThread-33釋放鎖成功,idThread-23獲取鎖成功,id執(zhí)行業(yè)務(wù)邏輯releaseThread-23釋放鎖成功,id都有很大的影響,本文實(shí)現(xiàn)的分布式鎖只是一種簡(jiǎn)單的實(shí)現(xiàn),主要學(xué)三種分布式對(duì)上面幾種方式,哪種方式都無(wú)法做到完美。正如 定理一樣,在復(fù)雜性、可用性分區(qū)容錯(cuò)性等方面無(wú)法同時(shí)滿足,所以要根據(jù)不同的應(yīng)用場(chǎng)景選擇最從理解的難易程度角度(從低到高>>從實(shí)現(xiàn)的復(fù)>>從實(shí)現(xiàn)的復(fù)雜性角度(從低到高Zookeeper>=>從性能角度(從高到低>Zookeeper>=從可靠性角度(從高到低Zookeeper>>Redis實(shí)現(xiàn)分布式鎖Zookeeper實(shí)現(xiàn)分布式鎖區(qū)redis

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論