redis同時読み書きロック、Redissonによる分散ロック

6093 ワード

テキストリンク:https://blog.csdn.net/l1028386804/article/details/73523810
1.Reentrant Lock Redissonの分散再ロック可能RLock Javaオブジェクトはjava.util.concurrent.locks.Lockインタフェースを実現し、自動期限切れのロック解除もサポートする.
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.Lockインタフェースを実現した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.レッドロック(RedLock)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(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();

転載:https://blog.csdn.net/l1028386804/article/details/73523810