Redisson에서 제공하는 여러 가지 락들

박종하·2025년 11월 20일

Redisson이란?

Redisson은 자바의 Redis 클라이언트 라이브러리다. 자바의 Redis 클라이언트 라이브러리는 여러 가지가 있는데, Lettuce와의 차이는 다음과 같다.

  • Redisson: 고수준의 추상화된 API 제공.
  • Lettuce: 저수준의 API, 경량화된 라이브러리.

장단점이 있는 만큼 적절한 것을 택하면 좋을 것 같다.

*다만 주의점이 있는데, Redisson과 Lettuce로 동시에 락을 관리하면 안된다. Redisson은 내부적으로 특정 키를 통해 분산 락 메커니즘을 구현하고 있는데, Lettuce에서 만에 하나 동일 키에 대해 작업을 하면 문제가 생길 수 있다.

Redisson에서 제공하는 대표적인 락들

Redisson에서 제공하는 대표적인 락들에 대해 알아보겠다.

Lock

자바의 Lock 인터페이스를 구현한 Reentrant Lock 객체다.

  • Reentrant Lock: 락을 소유하고 있는 스레드가 다시 락을 획득할 수 있는 락. => 자기 자신이 락을 점유한 채로 이 락을 요청하면 데드락이 발생하기 때문.(Hold and Wait)
  • 락 해제 시 Pub/Sub으로 브로드캐스팅해 대기 중인 스레드들에게 알린다.

만약 Lock을 관리하는 인스턴스가 죽으면 락 해제가 정상적으로 이루어지지 않는데, Redisson에서는 이를 Watchdog를 통해 관리한다. 락을 보유한 인스턴스가 락의 TTL을 계속 갱신하는 방법이다. 인스턴스가 죽으면 더 이상 갱신이 안되기 때문에 자연스럽게 락은 만료된다

  • 기본값: 30초.

leaseTime을 명시적으로 지정할 수 있는데, 이런 경우 Watchdog 기능은 비활성화된다.

RLock은 자바의 Lock과 동일하게 비선점 방식으로 작동한다.

*위 스펙은 다른 Redisson 락에서도 기본적으로 유효하다.

Fair Lock

자바의 Lock 인터페이스를 구현한 Reentrant Lock 객체로서, 스레드가 락을 요청한 순서대로 락을 획득할 수 있게 하는 공정 락이다.

  • 대기 중인 스레드는 큐를 통해 관리.(죽어있으면 5초간 대기)

MultiLock

여러 개의 락을 묶어 단일 락처럼 기능할 수 있게 해주는 락이다.

  • 각 락은 다른 인스턴스에 존재 가능.

Semaphore

자바의Semaphore 객체의 분산 버전이라고 생각하면 된다. 특이사항으로는 PermitExpirableSemaphore를 제공하는데 락 별로 TTL을 정할 수 있는 세마포어다.

Spin Lock

자바의 Lock 인터페이스를 구현한 Spin Lock 객체다. 스핀락은 기본적인 Pub/Sub 방식과는 다르게 동작하는데, 모든 노드에 계속 브로드캐스팅하면서 재시도를 하게 되면 Redis 인스턴스의 CPU에 큰 부담이 되기 때문에 지수적 백오프 전략으로 스핀 락을 구현했다.

Fenced Lock

자바의 Lock 인터페이스를 구현한 Fenced Lock 객체다.

펜싱 토큰을 가지고 있는 락이라고 생각하면 된다.

  • 락을 가지고 있는 인스턴스가 GC나 여러 이유로 죽었을 때 발생할 수 있는 문제를 예방하기 위함이다.

왜 이런 락이 필요할까? 다음과 같은 상황이 있을 수 있다.

  1. 락을 가지고 있는 인스턴스가 락을 해제하지 못한채로 죽음.
  2. 다른 인스턴스가 동일한 락을 획득.
  3. 죽어있던 인스턴스가 복구되고, 락을 가지고 있다고 믿음.
  4. 두 인스턴스에서 락을 가지고 있다고 믿는 상황 발생.

펜싱 토큰은 락을 획득할 때마다 증가하는 고유 번호로, 토큰 번호를 확인해 현재 유효한 락인지 아닌지 확인하는 방법이다.

  • 락뿐만 아니라 서버가 유효한 요청을 보내는지 검증하는 상황에서 사용할 수 있는 방법이다.

  • 현재보다 낮은 버전의 토큰? => 유효하지 않다는 뜻.


참고자료 및 출처

profile
Ex Pilot, Now Developer

0개의 댓글