[同時実行性]知っていますか?誰もがRedissonを使用して分散ロックを実装しています!!

前に書く

以前に尋ねた友達のグループを忘れてください:分散ロックに関する記事はありますか?@ @河?私の答えは、次のとおりです。今週は、[高同時実行性]のトピックでもあります。それについて考えた後、最初にRedissonを使用して分散ロックを実装する方法についての記事を投稿させてください。なんで?Redissonを使用して分散ロックを実装するのは簡単だからです。Redissonフレームワークは、Redisをベースにした分散ロックです。非常に強力で、使用するだけで済みます。分散ロックの原理については、別の記事を後で掲載します。

Redissonフレームワークは非常に強力であり、Redissonフレームワークに基づいて、考えられるほぼすべてのタイプの分散ロックを実現できます。ここでは、いくつかのタイプの分散ロックを列挙し、理解を深めるためのプログラム例を示します。分散ロックの原理の詳細については、フォローアップ記事についてゆっくりお話します!

1.再入可能ロック

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<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.フェアロック

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<Boolean> 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オブジェクトを赤いロックに関連付けることもできます。各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.セマフォ

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オブジェクトに基づいており、各信号に有効期限が追加されています。各信号は独立した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();

最後に書く

この記事が役に立った場合は、WeChatで「Binghe Technology」のWeChatアカウントを検索してフォローし、Bingheで同時実行プログラミングのテクニックを学んでください。

最後に、コンカレントプログラミングで習得する必要があるコアスキルナレッジマップを添付します。コンカレントプログラミングを学習するときは、回り道を避けてください。
ここに画像の説明を挿入

1353件のオリジナル記事が公開されました 2379件の賞賛 543万回の閲覧

おすすめ

転載: blog.csdn.net/l1028386804/article/details/105501212