Redisson
- Java 용 Redis 클라이언트 라이브러리
- 그냥 Redis 명령어만 실행하는 것이 아닌 분산 락, 세마포어, 큐, 캐시, Executor 등 고급 기능을 API 로 제공
- 내부적으로 레디스에 데이터 저장 + Lua Script 로 원자성 처리

주요 특징
- 분산 락 (단일, Redlock)
- 세마포어 (분산 환경에서 공유 자원에 대한 동시 접근을 제어하기 위한 동기화 메커니즘)
- 캐싱 (로컬/원격)
- 트랜잭션 지원
- Pub/Sub 지원
Lettuce
- 순수 Redis Command 기반의 비동기 / 반응형 Java 클라이언트
- 고급 기능 없이 Redis 명령어 실행에 집중
- 락, 세마포어 같은 고급 기능은 없어서 직접 구현
- Netty 기반으로 고성능, 비동기 처리 가능
주요 특징
- 기본 Redis Command 처리
- 비동기 / Reactive 지원 (CompletableFuture, Mono/Flux)
- Pub/Sub 지원
- 단순, 가벼움
락 획득 방식
락 획득 방식에도 둘의 차이점이 있는데, Redisson 은 Pub/Sub 구조, Lettuce 는 Spin Lock 방식이다.
SpinLock

setNx
메소드를 활용해 사용자가 직접 분산 락을 구현
- Lock의 timeout이 지정되어 있지 않기 때문에 lock 획득을 못하면 무한 루프를 돌게 될 수 있음
- 따라서, 일정 시간이 지나면 lock이 만료되도록 구현 필요
- Lock을 획득하는 최대 허용시간 또는 횟수를 정해주는 방법도 존재
- 만약 lock을 획득하는데 실패하면 연산을 수행할 수 없는 상태이므로 예외(Exception)를 던진다.
- Lock의 획득에 실패했을 경우 계속 lock을 점유하려고 시도하기 때문에, 요청이 많을수록 Redis가 받는 부하가 커지게 된다.
Pub/Sub

- Lock 구현체의 형태로 분산락을 제공
- 대기 없이
tryLock
메소드를 사용해 Lock 획득에 성공하면 true
를 반환
- Lock이 해제되면 Lock을 구독하는 클라이언트는 해제되었다는 신호를 받고 lock 획득을 시도
- Pub/Sub 방식을 사용하기 때문에, 스핀락 방식에 비해 redis에 지속적으로 lock 획득 요청을 보내는 과정이 없기에 Redis에 부하를 덜 준다는 장점이 있다.
lock.tryLock(LOCK_WAIT_TIME, LOCK_TIMEOUT, TimeUnit.SECONDS)
락 구조
[Client A] ---> tryLock() ---> Redis (set NX PX)
|
Success
|
비즈니스 로직
|
unlock() --> Lua Script로 해제 + 채널에 메시지 발행
[Client B] ---> tryLock() 실패
|
lock:seat:123 채널 구독 (Pub/Sub)
|
unlock 이벤트 수신
|
tryLock() 재시도