Redisson vs Lettuce

헨도·2일 전
0

Redis

목록 보기
2/3
post-thumbnail

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() 재시도
profile
Junior Backend Developer

0개의 댓글