Javaプログラミングredisson実装分散ロックコードの例

6656 ワード

最近仕事が忙しくて、長い間ブログを更新していませんでしたが、今日はRedissonの分散ロックに関する文章を持ってきました.はい、あまり言わないで、直接テーマに入ります.
1.再入可能ロック(Reentrant Lock)
Redissonの分布式再入ロックRLock Javaオブジェクトはjavaを実現した.util.concurrent.locks.ロックインタフェースは、自動期限切れのロック解除もサポートされています.

public void testReentrantLock(RedissonClient redisson){ 
  RLock lock = redisson.getLock("anyLock"); 
  try{ 
    // 1.   
    //lock.lock(); 
    // 2.  ,10 ,  unlock  
    //lock.lock(10, TimeUnit.SECONDS); 
    // 3.  , 3 , 10  
    boolean res = lock.tryLock(3, 10, TimeUnit.SECONDS); 
    if(res){ //  
    // do your business 
    } 
  } catch (InterruptedException e) { 
    e.printStackTrace(); 
  } finally { 
    lock.unlock(); 
  } 
} 

Redissonは、分散ロックの非同期実行に関する方法も提供します.

public void testAsyncReentrantLock(RedissonClient redisson){ 
  RLock lock = redisson.getLock("anyLock"); 
  try{ 
    lock.lockAsync(); 
    lock.lockAsync(10, TimeUnit.SECONDS); 
    Future 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分布式再入可能な公平ロックもjavaを実現した.util.concurrent.locks.ロックインタフェースのRLockオブジェクト.自動期限切れロック解除機能が提供されるとともに、複数のRedissonクライアントスレッドが同時にロックを要求する場合に、先に要求を発行したスレッドに優先的に割り当てられることが保証される.

public void testFairLock(RedissonClient redisson){ 
  RLock fairLock = redisson.getFairLock("anyLock"); 
  try{ 
    //   
    fairLock.lock(); 
    //  , 10 , unlock  
    fairLock.lock(10, TimeUnit.SECONDS); 
    //  , 100 , 10  
    boolean res = fairLock.tryLock(100, 10, TimeUnit.SECONDS); 
  } catch (InterruptedException e) { 
    e.printStackTrace(); 
  } finally { 
    fairLock.unlock(); 
  } 
} 

Redissonはまた、分散型再入可能なフェアロックに対して、非同期実行に関する方法を提供します.

RLock fairLock = redisson.getFairLock("anyLock"); 
fairLock.lockAsync(); 
fairLock.lockAsync(10, TimeUnit.SECONDS); 
Future res = fairLock.tryLockAsync(100, 10, TimeUnit.SECONDS); 

3.インターロック(MultiLock)
RedissonのRedissonMultiLockオブジェクトは、複数のRLockオブジェクトを1つのインターロックに関連付けることができ、各RLockオブジェクトインスタンスは異なるRedissonインスタンスから来ることができる.

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 { 
    //  :lock1 lock2 lock3,  。 
    lock.lock(); 
    //  , 100 , 10  
    boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS); 
  } catch (InterruptedException e) { 
    e.printStackTrace(); 
  } finally { 
    lock.unlock(); 
  } 
} 

4.レッドロック
RedissonのRedissonRedLockオブジェクトはRedlockが紹介したロックアルゴリズムを実現した.このオブジェクトはまた、複数のRLockオブジェクトを1つの赤ロックに関連付けるために使用することもでき、各RLockオブジェクトインスタンスは異なるRedissonインスタンスから来ることができる.

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 { 
    //  :lock1 lock2 lock3,  。 
    lock.lock(); 
    //  , 100 , 10  
    boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS); 
  } catch (InterruptedException e) { 
    e.printStackTrace(); 
  } finally { 
    lock.unlock(); 
  } 
} 

5.リードライトロック(ReadWriteLock)
Redissonの分布式は読み書きロックRReadWriteLockに再入可能で、Javaオブジェクトはjavaを実現した.util.concurrent.locks.ReadWriteLockインタフェース.また、自動期限切れロック解除もサポートされています.このオブジェクトでは、同時に複数の読み取りロックを許可しますが、最大1つの書き込みロックしかありません.

RReadWriteLock rwlock = redisson.getLock("anyRWLock"); 
//   
rwlock.readLock().lock(); 
//   
rwlock.writeLock().lock(); 
//   
// 10  
//  unlock  
rwlock.readLock().lock(10, TimeUnit.SECONDS); 
//   
rwlock.writeLock().lock(10, TimeUnit.SECONDS); 
//  , 100 , 10  
boolean res = rwlock.readLock().tryLock(100, 10, TimeUnit.SECONDS); 
//   
boolean res = rwlock.writeLock().tryLock(100, 10, TimeUnit.SECONDS); 
... 
lock.unlock(); 

6.信号量(Semaphore)
Redissonの分散信号量(Semaphore)Javaオブジェクト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.有効期限信号量(PermitExpirableSemaphore)
Redissonの有効期限付き信号量(PermitExpirableSemaphore)は、実際のRSemaphoreオブジェクトに基づいて、信号ごとに有効期限が1つ増加します.各信号は独立したIDで識別でき、解放時にこのIDをコミットすることによってしか解放できない.

RPermitExpirableSemaphore semaphore = redisson.getPermitExpirableSemaphore("mySemaphore"); 
String permitId = semaphore.acquire(); 
//  , 2 。 
String permitId = semaphore.acquire(2, TimeUnit.SECONDS); 
// ... 
semaphore.release(permitId); 

8.閉鎖(CountDownLatch)
Redissonの分布式閉鎖(CountDownLatch)JavaオブジェクトRCountDownLatchはjavaを採用した.util.concurrent.CountDownLatchの似たようなインタフェースと使い方.

RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch"); 
latch.trySetCount(1); 
latch.await(); 
//  JVM  
RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch"); 
latch.countDown(); 

まとめ
以上、Javaプログラミングredissonによる分散ロックコードの実装例のすべてです.興味のある方は、分散ロックの原理と3つの実装方法の詳細な解読、oracle racと分散データベースの違いの浅い説明、Spring Cloudと分散システムの概要、および当駅のその他の関連トピックを参照してください.不足点があれば、コメントを歓迎します.友达の本駅に対する支持に感谢します!