RBucket, RList 를 통해 효율적인 좌석 조회와 관리
야구장 예매 서비스를 MSA 환경으로 개발하면서, 실시간 좌석 상태를 빠르게 조회하고 예매할 수 있어야 했습니다.
동시 접속자 수가 많은 상황에서도 병목 없이 안정적인 서비스를 제공하기 위해 Redis를 활용한 캐싱 전략을 활용했습니다.
이 과정에서 좌석 데이터를 효율적으로 캐싱하고 조회하는 방법으로 RBucket 과 RList를 조합하는 방식을 선택했습니다.
좌석의 상태 데이터는 위와 같은 키 형태로 Redis 에 저장했습니다.
값은 다음과 같은 구조의 Map 형태로 저장했습니다.
{
"status": "available",
"userId": null,
"matchId": 3,
"createdAt": "20250410 10:24:10",
"expiredAt":
}
여기서 각 좌석 상태는 Redisson의 RBucket을 활용해 저장했습니다.
RBucket<Map<String, String>> bucket = redissonClient.getBucket(cacheKey);
bucket.set(cacheValue, Duration.ofMinutes(5));
5분 유효기간 설정
특정 날짜, 블록을 선택했을 때 seat:20250410:101:*:* 형식으로 와일드카드 조회를 하려면 getKeysByPattern() 또는 SCAN 명령어를 사용해야 합니다.
하지만 이 방법은 실시간 서비스에서
이라는 심각한 문제가 있습니다.
블록별로 좌석 키를 RList로 저장하여 해당 블록 좌석 조회 시, 리스트에서 키만 가져오고 필요한 좌석 정보는 각 키로 getBucket() 해서 조회
RList<String> blockSeats = redissonClient.getList(blockKey);
if (!blockSeats.contains(cacheKey)) {
blockSeats.add(cacheKey);
}
사용자 UI
| Key | 데이터 타입 | 내용 |
|---|---|---|
| seat:{date}:{block}:{column}:{row} | Rbucket | 좌석 상태 정보 |
| seatKeys:{date}:{block} | RList | 해당 블록의 좌석 키 목록 |


실시간성이 중요한 야구장 예매 서비스에서 좌석 데이터를 Redis RBucket + RList 조합으로 효율적으로 관리하여 빠른 좌석 조회 속도와 서버 부하 최소화를 모두 달성했습니다.
특히 기존 getKeysByPattern() 방식의 단점을 극복하고, 블록 단위의 좌석 리스트 관리 방식으로 확장성 있고 안정적인 예매 시스템을 구현할 수 있었습니다.