>  기사  >  Java  >  Redisson 분산 잠금을 구현하는 Java의 예

Redisson 분산 잠금을 구현하는 Java의 예

黄舟
黄舟원래의
2017-10-17 09:32:452230검색

이 기사에서는 분산 잠금 코드 예제를 구현하기 위한 Java 프로그래밍 재설계를 주로 소개합니다. 편집자는 이것이 꽤 좋다고 생각하여 도움이 필요한 친구들을 위해 여기에서 공유하겠습니다.

최근 일이 바빠서 오랫동안 블로그를 업데이트하지 못했습니다. 오늘은 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 Fair Lock

Redisson 분산 재진입 공정 잠금도 구현됩니다. java.util을 채택하는 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 개체는 인터록으로 연결됩니다. , 각 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. Red Lock(RedLock)

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 인터페이스를 구현합니다. 자동 만료 잠금 해제도 지원합니다. 이 객체는 동시에 여러 개의 읽기 잠금을 허용하지만 최대 하나의 쓰기 잠금을 가질 수 있습니다.


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 개체를 기반으로 하며 각 신호에 만료 시간을 추가합니다. 각 신호는 독립된 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();

요약

위 내용은 Redisson 분산 잠금을 구현하는 Java의 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.