Redisson 분산 객체 자료구조

헨도·약 21시간 전
0

Redis

목록 보기
3/3
post-thumbnail

Redisson ?

Java 의 Collection + 동시성 기능을 Redis 기반으로 분산 환경에서 제공하는 객체 컬렉션

Redisson 의 주요 분산 객체

RBucket

  • 단일 값 저장용 객체
  • Redis 의 String 과 1:1 매핑
  • 객체 1개 저장
  • TTL 설정 가능
RBucket<String> bucket = redisson.getBucket("seat:123");
bucket.set("RESERVERD", 10, TimeUnit.SECONDS);
String status = bucket.get();

RList (순서 있는 리스트)

  • Java List 와 동일
  • 순서 보장
  • 중복 허용
RList<String> rList = redisson.getList("seat:waitlist");
rList.add("user1");
rList.add("user2");
List<String> list = rList.readAll();

RSet (중복 없는 집합)

  • Java Set 과 동일
  • 중복 불가
  • 순서 없음
RSet<String> rSet = redisson.getSet("reserved-users");
rSet.add("user1");
rSet.add("user2");

RScoredSortedSet (점수 기반 정렬된 Set)

  • Redis Sorted Set 기반
  • 점수(Score) 로 정렬
RScoredSortedSet<String> rankedSet = redisson.getScoredSortedSet("rank");
rankedSet.add(100.0, "userA");
rankedSet.add(80.0, "userB");

rankedSet.first(); // 점수 낮은 순
rankedSet.last(); // 점수 높은 순

RMap (Key-Value Map)

  • Java Map + Redis Hash
  • 분산 환경에서 Key-Value 저장
RMap<String, String> rMap = redisson.getMap("match:2025-05-10");
rMap.put("seatA1", "RESERVED");
rMap.put("seatA2", "AVAILABLE");

RQueue (FIFO 큐)

  • Java Queue 와 동일
  • 순서 보장, 선입선출
RQueue<String> rQueue = redisson.getQueue("notify-queue");
rQueue.add("send-email");
rQueue.add("send-sms");

rQueue.poll(); // 맨 앞 제거 및 반환

RDeque (양방향 덱)

  • 양쪽에서 삽입/삭제 가능
RDeque<String> rDeque = redisson.getDeque("ticket-deque");
rDeque.addFirst("user1");
rDeque.addLast("user2");

락 & 동시성 컨트롤 객체

RLock

개념

  • Redis 를 이용해 여러 서버, 인스턴스에서 동일 리소스에 대한 접근을 하나로 제한
  • 분산 환경에서도 동시성 문제 없이 데이터 정합성 유지 가능

특징

  • lock(), tryLock(), unlock() 메서드 제공
  • 기본적으로 TTL 설정 가능 -> 락 점유 중 서버 장애 시 데드락 방지
  • 자동 연장 (watchdog) 기능으로 긴 트랜잭션에도 안정적
  • Fair Lock, Read-Write Lock, MultiLock, RedLock 제공

사용 사례

  • 좌석 예매 동시 예약 방지
  • 결제 중복 처리 방지
  • 쿠폰 선착순 발급

코드 예제

RLock lock = redisson.getLock("seat:lock:123");
lock.lock();

try {
	// 좌석 예약 처리
} finally {
	lock.unlock();
}

RSemaphore (분산 세마포어)

개념

  • 특정 리소스의 동시 접근 가능 개수를 제한
  • Redis 기반으로 여러 서버에서 동시에 접근 제어 가능

특징

  • 허용 가능한 동시 접속 수만큼 permit 설정
  • acquire() -> permit 획득
  • release() -> permit 반환
  • 서버 장애 시 permit 복구 가능

사용 사례

  • 좌석 구역당 동시 예약 가능 수 제한
  • 서버 접속 동시 사용자 수 제한
  • 다운로드 동시 처리량 제한

코드 예제

RSemaphore semaphore = redisson.getSemaphore("semaphore:vip-seat");

semaphore.trySetPermits(5); // 최초 permit 개수 설정
if (semaphore.tryAcquire()) {
	try {
    	// 동시 예약 가능 작업
    } finally {
    	semaphore.release();
    }
}

RCountDownLatch (분산 카운트다운 래치)

개념

  • 설정한 count 값이 0이 될 때까지 스레드(또는 프로세스)를 대기시키는 구조

특징

  • await() 호출 -> count 가 0이 될 때까지 대기
  • countDown() 호출 -> count 값 1 감소
  • 하나의 latch 에 여러 서버/프로세스가 await 가능
  • 비동기 이벤트 순차 처리 가능

사용 사례

  • 여러 작업이 모두 완료된 후 좌석 상태 반영
  • 대규모 이벤트 일괄 전송
  • 시스템 시작/초기화 시 동기화

코드 예제

RCountDownLatch latch = redisson.getCountDownLatch("latch:event-ready");
latch.trySetCount(3);

latch.await(); // 3이 될 때까지 대기

// 다른 곳에서 작업 끝나면 countDown 호출
RCountDownLatch latchWorker = redisson.getCountDownLatch("latch:event-ready");
latchWorker.countDown();

사용 시 주의사항

항상 적절한 TTL 설정

컬렉션 크기 및 데이터 용량 관리

락은 try-finally 로 해제 보장

대용량 List/Set/Queue 는 Redis 메모리 용량에 유의

profile
Junior Backend Developer

0개의 댓글