자바 분산 잠금을 사용하여 레디 스

당신은 루이 자바 교훈을 공유하여 학습을, 그것을 구현하고 프로젝트에 잠금에게 더 많은 정보를 배포하는 방법에 대한 자세한 내용을 보려면!

분산 잠금은 무엇인가?

다중 스레드 프로그램에서 다른 스레드가 동일한 리소스에 액세스해야 할 수 있습니다. 그러나 동시에 모든 스레드가 자원에 대한 액세스가 경쟁 조건 오류 및 기타 예기치 않은 동작이 발생할 수 있습니다.

두 개의 스레드가 동시에 같은 리소스에 액세스 할 수 있는지 확인하고 자원을 조작 할 수있는 예측 가능한 순서를 보장하기 위해 프로그래머는 잠금라는 메커니즘을 사용합니다. 각 스레드는 잠금 다른 스레드 자료에 마지막으로 자원을 조작하고, 먼저 잠금을 획득합니다.

자바, 여러 가지 이유에서, 락 객체가 사용되는 동기 블록들에 비해 일반적으로 더 유연하다. 첫째, 잠금 API는 다른 방식으로 작동 할 수 있지만, 완전히 동기화 블록 과정에 포함되어 있습니다.
스레드가 차단되는 경우 또한, 당신은 동기화 된 블록을 액세스 할 수 없습니다. 사용 잠금, 가능 만 잠금을 획득합니다 스레드. 이것은 크게 시간 대기 스레드 줄일 수 있습니다. 스레드가 대기하는 경우 또한, 당신은 스레드가 불가능 취득 동기 블록하려고 대기하는 경우에, 스레드를 차단하는 방법을 호출 할 수 있습니다.

당신은 여러 스레드 또는 프로세스를 고려할 필요가 없습니다 수단을 잠금 분산뿐만 아니라, 다른 컴퓨터에서 실행중인 다른 클라이언트를 고려해야합니다. 이 별도의 서버는 주어진 시간에 자원의 사용에 그들 중 그 하나를 위해 조정해야합니다.

잠금 도구는 분산 자바 레디 스를 기반으로

Redisson 프레임은 프로그래머가 로크 분산 복수의 오브젝트를 수행 할 필요성을 제공 할 수 있으며, Java 기반 레디 스 메모리 데이터 그리드이다. 아래에서는 각 옵션과의 차이점에 대해 설명합니다.

1. 잠금

자바 RLock 인터페이스 java.util.concurrent.locks.Lock 인터페이스. 이 자원을 잠글 수 있습니다 다중 스레드를 의미 재진입 잠금입니다. 카운터 변수 추적 잠금 요청이 여러 번 실행됩니다. 스레드 문제 잠금 해제 요청 충분한 카운터 0에 도달하면, 자원이 해제됩니다.

다음의 간단한 코드 예제 작성에 Redisson에 잠금 장치를 초기화하는 방법을 보여줍니다

RLock lock = redisson.getLock("anyLock");
// Most familiar locking method
lock.lock();
try {
  ...
} finally {
  lock.unlock();
}

획득 한 인스턴스가 Redisson이 잠금이 충돌하는 경우, 잠금이 영구적으로 정지 상태에서 획득 할 수있다. 이러한 상황을 방지하기 위해 잠금의 만료 시간을 연장, Redisson가 잠금 "감시"를 "감시"를 유지 여전히 잠금을 보유 Redisson 인스턴스 활성화됩니다. 기본적으로 30 초이 잠금 워치 독 타임 아웃. 당신은 Config.lockWatchdogTimeout 설정하여이 제한을 변경할 수 있습니다.

Redisson leaseTime은 임대를받을 때 당신이 매개 변수를 지정할 수 있습니다. 지정된 시간 간격 후, 잠금이 자동으로 해제된다

// Acquire lock and release it automatically after 10 seconds
// if unlock method hasn't been invoked
lock.lock(10, TimeUnit.SECONDS);
// Wait for 100 seconds and automatically unlock it after 10 seconds
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {
   try {
     ...
   } finally {
       lock.unlock();
   }
}

Redisson는 비동기 / 응답 / rxjava2 잠금 인터페이스 객체를 제공합니다 :

RLock lock = redisson.getLock("anyLock");
lock.lockAsync();
...
// Reactive Stream (Spring Project Reactor implementation)
RLockReactive lock = redissonReactive.getLock("anyLock");
Mono<Void> res = lock.lock();
...
// Reactive Stream (RxJava2 implementation)
RLockReactive lock = redissonRx.getLock("anyLock");
Flowable<Void> res = lock.lock();
...

RLock는 잠금 인터페이스, 잠금 해제 자원에 대한 스레드 잠금 그렇게 만 실현입니다. 그렇지 않으면, 어떤 시도는 예외 : IllegalMonitorStateException가 발생합니다.

2. FairLock

그 사촌 RLock처럼 RFairLock도 java.util.concurrent.locks.Lock 인터페이스를 깨달았다. FairLock를 사용하면 순서대로 스레드가 자원 (즉,``FIFO '큐를) 요청하도록 리소스에 액세스 할 수 있습니다. 큐에있는 다음 스레드에 대한 리소스를 해제하기 전에, Redisson 스레드를 다시 시작 죽은 오초했을 것이다.

그리고로 만들고 FairLock을 시작 RLocks 간단한 프로세스는 다음과 같습니다

RLock lock = redisson.getFairLock("anyLock");
lock.lock();
try {
  ...
} catch {
  lock.unlock();
}
  1. 하는 ReadWriteLock

    RReadWriteLock의 Redisson는 java.util.concurrent.locks.ReadWriteLock 인터페이스를 달성했다. 읽기 전용 잠금은 여러 스레드가 동시에있을 수 있지만, 스레드가 소유 한 번만 잠금을 쓸 수 있습니다 : 자바에서 읽기 / 쓰기 잠금이 잠금 장치의 조합은 사실이다.

다음과 같은 방법 만들고 RReadWriteLock를 초기화 :

RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");
rwlock.readLock().lock();
try {
  ...
} finally {
  rwlock.readLock().lock();
}
rwlock.writeLock().lock();
try {
  ...
} finally {
  rwlock.writeLock().lock();
}

4. RedLock

RedissonRedLock 객체 구현은 레디 스를 함께 사용하여 분산 잠금 잠금 알고리즘 Redlock :

RLock lock1 = redissonInstance1.getLock("lock1");
RLock lock2 = redissonInstance2.getLock("lock2");
RLock lock3 = redissonInstance3.getLock("lock3");
RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
lock.lock();
try {
  ...
} finally {
   lock.unlock();
}

Redlock 알고리즘에서, 우리는 별도의 컴퓨터 나 가상 머신에 많은 독립적 인 레디 스 마스터 노드가 있습니다. 알고리즘은 각각의 인스턴스에 대해 다음 실시 예를 로크를 획득하기 위해 랜덤 시퀀스의 동일한 키 이름 및 값을 사용하려고. 클라이언트가 효과적으로 총 시간보다 대부분의 경우에서 잠금에 대한 빠른 액세스를 고정 할 수있는 경우에만,이 잠금을 획득합니다.

5. 멀티 잠금

개별 개체의 RedissonMultiLock의 복수 RLock 예를 함께 합하고, 단일 엔티티로 관리 될 수있다 :

RLock lock1 = redissonInstance1.getLock("lock1");
RLock lock2 = redissonInstance2.getLock("lock2");
RLock lock3 = redissonInstance3.getLock("lock3");
RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
lock.lock();
try {
  ...
} finally {
  lock.unlock();
}

우리는 위의 위의 예에서 보았 듯이, 각 개체는 다른 RLock Redisson 인스턴스에 속할 수 있습니다. 차례로, 이것은 다른 레디 스 데이터베이스에 연결될 수있다.

결론

잠금, FairLock,하는 ReadWriteLock, RedLock 및 MultiLock :이 글에서, 우리는 자바 개발자를위한 Redisson 프레임 워크는 다른 도구 분산 잠금 장치의 번호를 수행 할 레디 스 데이터베이스의 상단에 사용할 수 있습니다에 대해 설명합니다. 분산 컴퓨팅에서 더 많은 정보를 Redisson를 들어, GitHub의에 위키 프로젝트를 따르십시오.

추천

출처blog.51cto.com/14634606/2462682