Java編程redisson實(shí)現(xiàn)分布式鎖代碼示例
最近由于工作很忙,很長(zhǎng)時(shí)間沒(méi)有更新博客了,今天為大家?guī)?lái)一篇有關(guān)Redisson實(shí)現(xiàn)分布式鎖的文章,好了,不多說(shuō)了,直接進(jìn)入主題。
1. 可重入鎖(Reentrant Lock)
Redisson的分布式可重入鎖RLock Java對(duì)象實(shí)現(xiàn)了java.util.concurrent.locks.Lock接口,同時(shí)還支持自動(dòng)過(guò)期解鎖。
public void testReentrantLock(RedissonClient redisson){ 
  RLock lock = redisson.getLock("anyLock"); 
  try{ 
    // 1. 最常見(jiàn)的使用方法 
    //lock.lock(); 
    // 2. 支持過(guò)期解鎖功能,10秒鐘以后自動(dòng)解鎖, 無(wú)需調(diào)用unlock方法手動(dòng)解鎖 
    //lock.lock(10, TimeUnit.SECONDS); 
    // 3. 嘗試加鎖,最多等待3秒,上鎖以后10秒自動(dòng)解鎖 
    boolean res = lock.tryLock(3, 10, TimeUnit.SECONDS); 
    if(res){ //成功 
    // do your business 
    } 
  } catch (InterruptedException e) { 
    e.printStackTrace(); 
  } finally { 
    lock.unlock(); 
  } 
} 
Redisson同時(shí)還為分布式鎖提供了異步執(zhí)行的相關(guān)方法:
public void testAsyncReentrantLock(RedissonClient redisson){ 
  RLock lock = redisson.getLock("anyLock"); 
  try{ 
    lock.lockAsync(); 
    lock.lockAsync(10, TimeUnit.SECONDS); 
    Future<Boolean> res = lock.tryLockAsync(3, 10, TimeUnit.SECONDS); 
    if(res.get()){ 
    // do your business 
    } 
  } catch (InterruptedException e) { 
    e.printStackTrace(); 
  } catch (ExecutionException e) { 
    e.printStackTrace(); 
  } finally { 
    lock.unlock(); 
  } 
} 
2. 公平鎖(Fair Lock)
Redisson分布式可重入公平鎖也是實(shí)現(xiàn)了java.util.concurrent.locks.Lock接口的一種RLock對(duì)象。在提供了自動(dòng)過(guò)期解鎖功能的同時(shí),保證了當(dāng)多個(gè)Redisson客戶(hù)端線(xiàn)程同時(shí)請(qǐng)求加鎖時(shí),優(yōu)先分配給先發(fā)出請(qǐng)求的線(xiàn)程。
public void testFairLock(RedissonClient redisson){ 
  RLock fairLock = redisson.getFairLock("anyLock"); 
  try{ 
    // 最常見(jiàn)的使用方法 
    fairLock.lock(); 
    // 支持過(guò)期解鎖功能, 10秒鐘以后自動(dòng)解鎖,無(wú)需調(diào)用unlock方法手動(dòng)解鎖 
    fairLock.lock(10, TimeUnit.SECONDS); 
    // 嘗試加鎖,最多等待100秒,上鎖以后10秒自動(dòng)解鎖 
    boolean res = fairLock.tryLock(100, 10, TimeUnit.SECONDS); 
  } catch (InterruptedException e) { 
    e.printStackTrace(); 
  } finally { 
    fairLock.unlock(); 
  } 
} 
Redisson同時(shí)還為分布式可重入公平鎖提供了異步執(zhí)行的相關(guān)方法:
RLock fairLock = redisson.getFairLock("anyLock"); 
fairLock.lockAsync(); 
fairLock.lockAsync(10, TimeUnit.SECONDS); 
Future<Boolean> res = fairLock.tryLockAsync(100, 10, TimeUnit.SECONDS); 
3. 聯(lián)鎖(MultiLock)
Redisson的RedissonMultiLock對(duì)象可以將多個(gè)RLock對(duì)象關(guān)聯(lián)為一個(gè)聯(lián)鎖,每個(gè)RLock對(duì)象實(shí)例可以來(lái)自于不同的Redisson實(shí)例。
public void testMultiLock(RedissonClient redisson1,RedissonClient redisson2, RedissonClient redisson3){ 
  RLock lock1 = redisson1.getLock("lock1"); 
  RLock lock2 = redisson2.getLock("lock2"); 
  RLock lock3 = redisson3.getLock("lock3"); 
  RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3); 
  try { 
    // 同時(shí)加鎖:lock1 lock2 lock3, 所有的鎖都上鎖成功才算成功。 
    lock.lock(); 
    // 嘗試加鎖,最多等待100秒,上鎖以后10秒自動(dòng)解鎖 
    boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS); 
  } catch (InterruptedException e) { 
    e.printStackTrace(); 
  } finally { 
    lock.unlock(); 
  } 
} 
4. 紅鎖(RedLock)
Redisson的RedissonRedLock對(duì)象實(shí)現(xiàn)了Redlock介紹的加鎖算法。該對(duì)象也可以用來(lái)將多個(gè)RLock對(duì)象關(guān)聯(lián)為一個(gè)紅鎖,每個(gè)RLock對(duì)象實(shí)例可以來(lái)自于不同的Redisson實(shí)例。
public void testRedLock(RedissonClient redisson1,RedissonClient redisson2, RedissonClient redisson3){ 
  RLock lock1 = redisson1.getLock("lock1"); 
  RLock lock2 = redisson2.getLock("lock2"); 
  RLock lock3 = redisson3.getLock("lock3"); 
  RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3); 
  try { 
    // 同時(shí)加鎖:lock1 lock2 lock3, 紅鎖在大部分節(jié)點(diǎn)上加鎖成功就算成功。 
    lock.lock(); 
    // 嘗試加鎖,最多等待100秒,上鎖以后10秒自動(dòng)解鎖 
    boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS); 
  } catch (InterruptedException e) { 
    e.printStackTrace(); 
  } finally { 
    lock.unlock(); 
  } 
} 
5. 讀寫(xiě)鎖(ReadWriteLock)
Redisson的分布式可重入讀寫(xiě)鎖RReadWriteLock,Java對(duì)象實(shí)現(xiàn)了java.util.concurrent.locks.ReadWriteLock接口。同時(shí)還支持自動(dòng)過(guò)期解鎖。該對(duì)象允許同時(shí)有多個(gè)讀取鎖,但是最多只能有一個(gè)寫(xiě)入鎖。
RReadWriteLock rwlock = redisson.getLock("anyRWLock"); 
// 最常見(jiàn)的使用方法 
rwlock.readLock().lock(); 
// 或 
rwlock.writeLock().lock(); 
// 支持過(guò)期解鎖功能 
// 10秒鐘以后自動(dòng)解鎖 
// 無(wú)需調(diào)用unlock方法手動(dòng)解鎖 
rwlock.readLock().lock(10, TimeUnit.SECONDS); 
// 或 
rwlock.writeLock().lock(10, TimeUnit.SECONDS); 
// 嘗試加鎖,最多等待100秒,上鎖以后10秒自動(dòng)解鎖 
boolean res = rwlock.readLock().tryLock(100, 10, TimeUnit.SECONDS); 
// 或 
boolean res = rwlock.writeLock().tryLock(100, 10, TimeUnit.SECONDS); 
... 
lock.unlock(); 
6. 信號(hào)量(Semaphore)
Redisson的分布式信號(hào)量(Semaphore)Java對(duì)象RSemaphore采用了與java.util.concurrent.Semaphore相似的接口和用法。
RSemaphore semaphore = redisson.getSemaphore("semaphore"); 
semaphore.acquire(); 
//或 
semaphore.acquireAsync(); 
semaphore.acquire(23); 
semaphore.tryAcquire(); 
//或 
semaphore.tryAcquireAsync(); 
semaphore.tryAcquire(23, TimeUnit.SECONDS); 
//或 
semaphore.tryAcquireAsync(23, TimeUnit.SECONDS); 
semaphore.release(10); 
semaphore.release(); 
//或 
semaphore.releaseAsync(); 
7. 可過(guò)期性信號(hào)量(PermitExpirableSemaphore)
Redisson的可過(guò)期性信號(hào)量(PermitExpirableSemaphore)實(shí)在RSemaphore對(duì)象的基礎(chǔ)上,為每個(gè)信號(hào)增加了一個(gè)過(guò)期時(shí)間。每個(gè)信號(hào)可以通過(guò)獨(dú)立的ID來(lái)辨識(shí),釋放時(shí)只能通過(guò)提交這個(gè)ID才能釋放。
RPermitExpirableSemaphore semaphore = redisson.getPermitExpirableSemaphore("mySemaphore"); 
String permitId = semaphore.acquire(); 
// 獲取一個(gè)信號(hào),有效期只有2秒鐘。 
String permitId = semaphore.acquire(2, TimeUnit.SECONDS); 
// ... 
semaphore.release(permitId); 
8. 閉鎖(CountDownLatch)
Redisson的分布式閉鎖(CountDownLatch)Java對(duì)象RCountDownLatch采用了與java.util.concurrent.CountDownLatch相似的接口和用法。
RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch"); 
latch.trySetCount(1); 
latch.await(); 
// 在其他線(xiàn)程或其他JVM里 
RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch"); 
latch.countDown(); 
總結(jié)
以上就是本文關(guān)于Java編程redisson實(shí)現(xiàn)分布式鎖代碼示例的全部?jī)?nèi)容,感興趣的朋友可以參閱:詳細(xì)解讀分布式鎖原理及三種實(shí)現(xiàn)方式、淺談oracle rac和分布式數(shù)據(jù)庫(kù)的區(qū)別、Spring Cloud與分布式系統(tǒng)簡(jiǎn)析以及本站其他相關(guān)專(zhuān)題,希望對(duì)大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
上一篇:Java編程倒計(jì)時(shí)實(shí)現(xiàn)方法示例
欄 目:Java編程
下一篇:Java實(shí)現(xiàn)文件分割和文件合并實(shí)例
本文標(biāo)題:Java編程redisson實(shí)現(xiàn)分布式鎖代碼示例
本文地址:http://www.jygsgssxh.com/a1/Javabiancheng/8456.html
您可能感興趣的文章
- 01-10Java咖啡館(1)——嘆咖啡
 - 01-10Java Socket編程(三) 服務(wù)器Sockets
 - 01-10Java進(jìn)階:Struts多模塊的技巧
 - 01-10Java Socket編程(一) Socket傳輸模式
 - 01-10Java Socket編程(二) Java面向連接的類(lèi)
 - 01-10Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
 - 01-10Java經(jīng)驗(yàn)點(diǎn)滴:處理沒(méi)有被捕獲的異常
 - 01-10Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)器
 - 01-10Java中的浮點(diǎn)數(shù)分析
 - 01-10面向?qū)ο缶幊?Java中的抽象數(shù)據(jù)類(lèi)型
 


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
 - 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
 - 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語(yǔ)言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 01-10Java咖啡館(1)——嘆咖啡
 - 01-10JVM的垃圾回收機(jī)制詳解和調(diào)優(yōu)
 - 01-10Java Socket編程(三) 服務(wù)器Sockets
 - 01-10Java進(jìn)階:Struts多模塊的技巧
 - 01-10J2SE 1.5版本的新特性一覽
 - 01-10Java Socket編程(一) Socket傳輸模式
 - 01-10Java運(yùn)行時(shí)多態(tài)性的實(shí)現(xiàn)
 - 01-10Java Socket編程(二) Java面向連接的類(lèi)
 - 01-10Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)
 - 01-10Java經(jīng)驗(yàn)點(diǎn)滴:處理沒(méi)有被捕獲的異常
 
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
 - 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
 - 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
 - 01-10C#中split用法實(shí)例總結(jié)
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 01-10delphi制作wav文件的方法
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
 - 04-02jquery與jsp,用jquery
 


