Redisson을 활용하여 Redis 분산 락 구현

남기은·2025년 11월 29일

동시성 제어

목록 보기
5/7

Redisson 이란?

Redisson은 Redis를 이용한 분산 환경에서의 락 관리, 캐시, 이벤트 시스템 등을 편리하게 제공하는 Java Redis 클라이언트이다.
이때, 락을 획득하지 못한 스레드를 대기시키고 다시 깨우는 과정을 pub/sub 방식으로 처리한다.

pub/sub 방식 이란?

  1. Thread 1 : 락 획득
  2. Thread 2 : 락 획득 시도
  3. Thread 2 : Redis의 특정 채널 구독(subscribe)
  4. Thread 1 : 작업 후, 락 해체 → Redis는 해당 채널에 발행(publish)
  5. Thread 2 : 메시지를 받고 락 획득 재시도 후 획득

구현방법

전제 : Redis에 대한 기본 설정은 완료되었다고 가정한다.

프로젝트 설정

build.gradle에 아래 의존성 추가

// Redisson 의존성
implementation("org.redisson:redisson-spring-boot-starter:3.52.0")

Spring Boot가 실행되면 자동으로 RedissonClient Bean이 생성되어 사용할 수 있다.

분산 락 구현코드

  • tryLock 파라미터 설명
RLock.tryLock(waitTime, leaseTime, TimeUnit)

- waitTime : 락 획득을 위해 최대 얼마나 기다릴지
- leaseTime : 락 유지 시간
    - leaseTime을 지정하면 → 해당 시간이 지나면 자동 해제됨
    - leaseTime을 지정하지 않으면 → 기본 TTL 30+ Watchdog이 자동으로 연장
  • 구현 코드
public void addLike(Long postId) {
        RLock lock = redissonClient.getLock(key + postId.toString());

        try {
		        // 3초 동안 락 획득 대기, 락을 얻으면 1초간 유지
            boolean available = lock.tryLock(3, 1, TimeUnit.SECONDS);

            // 락 획득에 실패한 경우
            if(!available) {
                log.info("락 획득 실패");
                return;
            }

            // 비즈니스 로직 실행
            postService.addLike(postId);
        } catch (InterruptedException e) { // 예외처리
            throw new RuntimeException(e);
        } finally {
            // 비즈니스 로직 실행 후, 락 해제
            lock.unlock();
        }
    }
profile
느리지만 꾸준한 개발자 남기은입니다

0개의 댓글