1. 程式人生 > >redis併發讀寫鎖,使用Redisson實現分散式鎖

redis併發讀寫鎖,使用Redisson實現分散式鎖

今天為大家帶來一篇有關Redisson實現分散式鎖的文章,好了,不多說了,直接進入主題。

1. 可重入鎖(Reentrant Lock)

Redisson的分散式可重入鎖RLock Java物件實現了java.util.concurrent.locks.Lock介面,同時還支援自動過期解鎖。

  1. publicvoid testReentrantLock(RedissonClient redisson){  
  2.     RLock lock = redisson.getLock("anyLock");  
  3.     try{  
  4.         // 1. 最常見的使用方法
  5.         //lock.lock();
  6.         // 2. 支援過期解鎖功能,10秒鐘以後自動解鎖, 無需呼叫unlock方法手動解鎖
  7.         //lock.lock(10, TimeUnit.SECONDS);
  8.         // 3. 嘗試加鎖,最多等待3秒,上鎖以後10秒自動解鎖
  9.         boolean res = lock.tryLock(310, TimeUnit.SECONDS);  
  10.         if(res){ //成功
  11.         // do your business
  12.         }  
  13.     } catch (InterruptedException e) {  
  14.         e.printStackTrace();  
  15.     } finally {  
  16.         lock.unlock();  
  17.     }  
  18. }  
Redisson同時還為分散式鎖提供了非同步執行的相關方法:
  1. publicvoid testAsyncReentrantLock(RedissonClient redisson){  
  2.     RLock lock = redisson.getLock("anyLock");  
  3.     try{  
  4.         lock.lockAsync();  
  5.         lock.lockAsync(10, TimeUnit.SECONDS);  
  6.         Future<Boolean> res = lock.tryLockAsync(310, TimeUnit.SECONDS);  
  7.         if(res.get()){  
  8.         // do your business
  9.         }  
  10.     } catch (InterruptedException e) {  
  11.         e.printStackTrace();  
  12.     } catch (ExecutionException e) {  
  13.         e.printStackTrace();  
  14.     } finally {  
  15.         lock.unlock();  
  16.     }  
  17. }  

2. 公平鎖(Fair Lock)

Redisson分散式可重入公平鎖也是實現了java.util.concurrent.locks.Lock介面的一種RLock物件。在提供了自動過期解鎖功能的同時,保證了當多個Redisson客戶端執行緒同時請求加鎖時,優先分配給先發出請求的執行緒。

  1. publicvoid testFairLock(RedissonClient redisson){  
  2.     RLock fairLock = redisson.getFairLock("anyLock");  
  3.     try{  
  4.         // 最常見的使用方法
  5.         fairLock.lock();  
  6.         // 支援過期解鎖功能, 10秒鐘以後自動解鎖,無需呼叫unlock方法手動解鎖
  7.         fairLock.lock(10, TimeUnit.SECONDS);  
  8.         // 嘗試加鎖,最多等待100秒,上鎖以後10秒自動解鎖
  9.         boolean res = fairLock.tryLock(10010, TimeUnit.SECONDS);  
  10.     } catch (InterruptedException e) {  
  11.         e.printStackTrace();  
  12.     } finally {  
  13.         fairLock.unlock();  
  14.     }  
  15. }  
Redisson同時還為分散式可重入公平鎖提供了非同步執行的相關方法:
  1. RLock fairLock = redisson.getFairLock("anyLock");  
  2. fairLock.lockAsync();  
  3. fairLock.lockAsync(10, TimeUnit.SECONDS);  
  4. Future<Boolean> res = fairLock.tryLockAsync(10010, TimeUnit.SECONDS);  

3. 聯鎖(MultiLock)

Redisson的RedissonMultiLock物件可以將多個RLock物件關聯為一個聯鎖,每個RLock物件例項可以來自於不同的Redisson例項。

  1. publicvoid testMultiLock(RedissonClient redisson1,RedissonClient redisson2, RedissonClient redisson3){  
  2.     RLock lock1 = redisson1.getLock("lock1");  
  3.     RLock lock2 = redisson2.getLock("lock2");  
  4.     RLock lock3 = redisson3.getLock("lock3");  
  5.     RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);  
  6.     try {  
  7.         // 同時加鎖:lock1 lock2 lock3, 所有的鎖都上鎖成功才算成功。
  8.         lock.lock();  
  9.         // 嘗試加鎖,最多等待100秒,上鎖以後10秒自動解鎖
  10.         boolean res = lock.tryLock(10010, TimeUnit.SECONDS);  
  11.     } catch (InterruptedException e) {  
  12.         e.printStackTrace();  
  13.     } finally {  
  14.         lock.unlock();  
  15.     }  
  16. }  

4. 紅鎖(RedLock)

Redisson的RedissonRedLock物件實現了Redlock介紹的加鎖演算法。該物件也可以用來將多個RLock物件關聯為一個紅鎖,每個RLock物件例項可以來自於不同的Redisson例項。

  1. publicvoid testRedLock(RedissonClient redisson1,RedissonClient redisson2, RedissonClient redisson3){  
  2.     RLock lock1 = redisson1.getLock("lock1");  
  3.     RLock lock2 = redisson2.getLock("lock2");  
  4.     RLock lock3 = redisson3.getLock("lock3");  
  5.     RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);  
  6.     try {  
  7.         // 同時加鎖:lock1 lock2 lock3, 紅鎖在大部分節點上加鎖成功就算成功。
  8.         lock.lock();  
  9.         // 嘗試加鎖,最多等待100秒,上鎖以後10秒自動解鎖
  10.         boolean res = lock.tryLock(10010, TimeUnit.SECONDS);  
  11.     } catch (InterruptedException e) {  
  12.         e.printStackTrace();  
  13.     } finally {  
  14.         lock.unlock();  
  15.     }  
  16. }  

5. 讀寫鎖(ReadWriteLock)

Redisson的分散式可重入讀寫鎖RReadWriteLock,Java物件實現了java.util.concurrent.locks.ReadWriteLock介面。同時還支援自動過期解鎖。該物件允許同時有多個讀取鎖,但是最多隻能有一個寫入鎖。

  1. RReadWriteLock rwlock = redisson.getLock("anyRWLock");  
  2. // 最常見的使用方法
  3. rwlock.readLock().lock();  
  4. // 或
  5. rwlock.writeLock().lock();  
  6. // 支援過期解鎖功能
  7. // 10秒鐘以後自動解鎖
  8. // 無需呼叫unlock方法手動解鎖
  9. rwlock.readLock().lock(10, TimeUnit.SECONDS);  
  10. // 或
  11. rwlock.writeLock().lock(10, TimeUnit.SECONDS);  
  12. // 嘗試加鎖,最多等待100秒,上鎖以後10秒自動解鎖
  13. boolean res = rwlock.readLock().tryLock(10010, TimeUnit.SECONDS);  
  14. // 或
  15. boolean res = rwlock.writeLock().tryLock(10010, TimeUnit.SECONDS);  
  16. ...  
  17. lock.unlock();  

6. 訊號量(Semaphore)

Redisson的分散式訊號量(Semaphore)Java物件RSemaphore採用了與java.util.concurrent.Semaphore相似的介面和用法。

  1. RSemaphore semaphore = redisson.getSemaphore("semaphore");  
  2. semaphore.acquire();  
  3. //或
  4. semaphore.acquireAsync();  
  5. semaphore.acquire(23);  
  6. semaphore.tryAcquire();  
  7. 相關推薦

    redis併發使用Redisson實現分散式

    今天為大家帶來一篇有關Redisson實現分散式鎖的文章,好了,不多說了,直接進入主題。1. 可重入鎖(Reentrant Lock)Redisson的分散式可重入鎖RLock Java物件實現了java.util.concurrent.locks.Lock介面,同時還支援自

    【原創】redis庫存操作分散式的四種實現方式[連載二]--基於Redisson實現分散式

    一、redisson介紹 redisson實現了分散式和可擴充套件的java資料結構,支援的資料結構有:List, Set, Map, Queue, SortedSet, ConcureentMap, Lock, AtomicLong, CountDownLatch。並且是執行緒安全的,底層使用N

    四:redis主從分離哨兵模式與spring的整合

    本篇主要介紹redis實現主從讀寫分離,採用哨兵模式後如何與spring整合在專案中進行開發 主要依賴的jar包,其他專案中實際依賴的jar包很多這裡就不一一列舉了: jar包依賴 <dependency> <grou

    關於redis中使用機制實現分散式和任務佇列)

    場景:       電商網站上有很多秒殺活動,會迎來一個使用者請求的高峰期,可能會有幾十萬幾百萬的併發量,來搶這個手機,在高併發的情形下會對資料庫伺服器或者是檔案伺服器應用伺服器造成巨大的壓力,嚴重時說不定就宕機了;       另一個問題是,秒殺的東西都是有量的,一款手

    【高併發】你知道嗎?大家都在使用Redisson實現分散式了!!

    寫在前面 忘記之前在哪個群裡有朋友在問:有出分散式鎖的文章嗎~@冰河?我的回答是:這週會有,也是【高併發】專題的。想了想,還是先發一個如何使用Redisson實現分散式鎖的文章吧?為啥?因為使用Redisson實現分散式鎖簡單啊!Redisson框架是基於Redis實現的分散式鎖,非常強大,只需要拿來使用就

    利用Redisson實現分散式及其底層原理解析

    Redis介紹 redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合)、zset(sorted set --有序集合)和hash(雜湊型別)。這些資料型別都支援push/po

    Redisson實現分散式

    Redisson文件參考:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95   開始引入 pom檔案中引入依賴: <!-- redisson 分散式鎖實現 --> <dependency>

    SpringBoot專案開發(十五):redisson實現分散式

    1.為什麼要使用分散式鎖?       在分散式場景下為了保證資料最終一致性。在單程序的系統中,存在多個執行緒可以同時改變某個變數(可變共享變數)時,就需要對變數或程式碼塊做同步(lock—synchronized),使其在修改這種變數時能夠線性執行消除併發修

    Java之——Redisson實現分散式

    1. 可重入鎖(Reentrant Lock)Redisson的分散式可重入鎖RLock Java物件實現了java.util.concurrent.locks.Lock介面,同時還支援自動過期解鎖。publicvoid testReentrantLock(RedissonC

    spring整合redisson實現分散式

    在單程序的系統中,當存在多個執行緒可以同時改變某個變數(可變共享變數)時,就需要對變數或程式碼塊做同步,使其在修改這種變數時能夠線性執行消除併發修改變數。 而Java提供的同步鎖synchronized只能解決單臺伺服器上的併發問題,一般線上環境都是多臺伺服器

    Redisson實現分散式---原理

    Redisson實現分散式鎖---原理 有關Redisson作為實現分散式鎖,總的分3大模組來講。 1、Redisson實現分散式鎖原理 2、Redisson實現分散式鎖的原始碼解析 3、Redisson實現分散式鎖的專案程式碼(可以用於實際專案中) 本文只介紹Redisson如何實現分散式鎖的原理。其它的會

    Redisson實現分散式—RedissonLock

    Redisson實現分散式鎖—RedissonLock 有關Redisson實現分散式鎖上一篇部落格講了分散式的鎖原理:Redisson實現分散式鎖---原理 這篇主要講RedissonLock和RLock。Redisson分散式鎖的實現是基於RLock介面,RedissonLock實現RLock介面。 一、

    Redisson實現分散式(3)—專案落地實現

    Redisson實現分散式鎖(3)—專案落地實現 有關Redisson實現分散式鎖前面寫了兩篇部落格作為該專案落地的鋪墊。 1、Redisson實現分散式鎖(1)---原理 2、Redisson實現分散式鎖(2)—RedissonLock 這篇講下通過Redisson實現分散式鎖的專案實現,我會把專案放到Gi

    Redisson 實現分散式的原理分析

    寫在前面 在瞭解分散式鎖具體實現方案之前,我們應該先思考一下使用分散式鎖必須要考慮的一些問題。​ 互斥性:在任意時刻,只能有一個程序持有鎖。 防死鎖:即使有一個程序在持有鎖的期間崩潰而未能主動釋放鎖,要有其他方式去釋放鎖從而保證其他程序能獲取到鎖。 加鎖和解鎖的必須是同一個程序。 鎖的續期問題

    一個實現與使用(優先C++實現

    參考網上資料,實現了一個讀寫鎖,寫優先。使用起來也很簡單。 使用: //先定義一個全域性鎖物件 tg_rwlock g_rwlock; void test() { { tg_rwlock::read_guard(g_rwlock); //讀....

    redis分離主從復制

    req con word redis讀寫分離 分離 bsp onf 服務 master master配置:(主服務 redis.conf)   requirepass masterpassword (配置密碼)   port 6379 (配置端口) slave配置   re

    node.js 利用流實現同步

    write 使用 類型 同步 node.js tar 利用 關閉 console //10個數 10個字節,每次讀4b,寫1b let fs=require("fs"); function pipe(source,target) { //先創建可讀流,再創

    實現MySQL分離MySQL性能調優

    affect iad list cte 軟件包 密碼 sts 要求 select 實現MySQL讀寫分離 1.1 問題 本案例要求配置2臺MySQL服務器+1臺代理服務器,實現MySQL代理的讀寫分離: 用戶只需要訪問MySQL代理服務器,而實際的SQL查詢、寫入操作交給

    阿里P8架構師談:資料庫分庫分表、分離的原理實現使用場景

    為什麼要分庫分表和讀寫分離?   類似淘寶網這樣的網站,海量資料的儲存和訪問成為了系統設計的瓶頸問題,日益增長的業務資料,無疑對資料庫造成了相當大的負載,同時對於系統的穩定性和擴充套件性提出很高的要求。隨著時間和業務的發展,資料庫中的表會越來越多,表中的資料量也會越來越大,相應地,

    springboot2結合redis實現分散式

    1.新增Maven依賴 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId>