앞선 글에서 Redisson과 Lua를 활용한 원자적 연산의 흐름과 구조를 소개했다. 이번 글에서는 Redisson이 어떤 객체를 Redis에 저장할 수 있는지, 그리고 이를 활용한 고급 기능들인 분산 락, 캐시, 원자 스크립트 실행은 어떤 구조로 제공되는지를 살펴본다.
Redisson은 기본적으로 Redis에서 제공하는 자료구조 위에 추상화된 API를 얹는다. Redis에서 제공하는 핵심 자료형은 다음과 같다:
자료형 | 설명 | 명령어 예시 |
---|---|---|
String | 일반 문자열 값 | SET , GET , INCR |
Hash | 필드-값 쌍 저장 | HSET , HGET , HDEL |
List | 순서 있는 값의 리스트 | LPUSH , RPUSH , LPOP , LRANGE |
Set | 중복 없는 값의 집합 | SADD , SMEMBERS , SPOP |
ZSet | 점수 기반 정렬된 집합 | ZADD , ZRANGE , ZREMRANGEBYSCORE |
Stream | Kafka-like 메시지 큐 | XADD , XREADGROUP , XACK |
Bitmap | 비트 연산 | SETBIT , GETBIT |
HyperLogLog | 근사치 기반 카운터 | PFADD , PFCOUNT |
Geo | 위치 기반 데이터 | GEOADD , GEORADIUS |
Redisson은 Redis의 위 자료형을 Java 객체처럼 다룰 수 있도록 다양한 인터페이스를 제공한다. 대표적으로 다음과 같다:
Redisson 객체 | Redis 구조 | 설명 |
---|---|---|
RMap<K, V> | Hash | 일반적인 Map 인터페이스 |
RMapCache<K, V> | Hash + TTL | 만료 시간 있는 Map |
RList<V> | List | ArrayList처럼 사용 가능 |
RSet<V> | Set | 중복 없는 집합 |
RQueue<V> / RDeque<V> | List | 큐/스택 자료 구조 구현 |
RScoredSortedSet<V> | ZSet | 점수 기반 정렬 집합 |
RLexSortedSet | ZSet | 사전순 정렬 집합 |
Redisson 객체 | 설명 |
---|---|
RAtomicLong | 분산 환경에서 안전한 long 타입 카운터 |
RAtomicDouble | 분산 환경에서 안전한 double 카운터 |
RLongAdder | 고속 누적기 (멀티 쓰레드 최적화) |
객체 | 설명 |
---|---|
RJsonBucket<T> | JSON 직렬화 기반 저장소 |
reactive() | 반응형 API 지원 (Project Reactor) |
rxJava() | RxJava 기반 API 지원 |
Redisson은 단순한 키-값 저장소를 넘어서, 동시성 제어와 분산 환경을 위한 구조를 지원한다.
val lock = redissonClient.getLock("lock:seat:123")
lock.tryLock(500, 3000, TimeUnit.MILLISECONDS)
// 좌석 예약 처리
lock.unlock()
SET key value NX PX
기반 구현RLock
, RFencedLock
, RReadWriteLock
, RMultiLock
등 다양한 옵션 존재val mapCache = redissonClient.getMapCache<String, Movie>("cache:movie:list")
mapCache.put("popular", movieList, 10, TimeUnit.MINUTES)
val luaScript = loadLua("ip_ratelimit.lua")
val result = redissonClient
.getScript(StringCodec.INSTANCE)
.eval<Long>(
RScript.Mode.READ_WRITE,
luaScript,
RScript.ReturnType.INTEGER,
listOf(key, blockedKey),
limit.toString(),
now.toString(),
expireMillis.toString()
)
Lua 스크립트는 스크립트 단위로 원자성을 보장한다.
단, 스크립트 여러 개를 순차 실행한다고 해서 전체 트랜잭션처럼 묶이지는 않는다. 이럴 경우RBatch
,MULTI/EXEC
, 또는 Kafka 기반의 흐름 제어 등 별도 조치 필요.
기능 | RedisTemplate | Redisson |
---|---|---|
기본 자료형 지원 | O | O |
복합 객체 지원 | X | O (RMap , RSet , RList 등) |
분산 락 | X (직접 구현 필요) | O (RLock ) |
캐시 TTL 지원 | O (set + expire) | O (RMapCache ) |
로컬 캐시 | X | O (RLocalCachedMap ) |
Lua 스크립트 | 제한적 | O (RScript + Lua) |
배치 처리 | 제한적 | O (RBatch ) |
트랜잭션 처리 | MULTI/EXEC | 부분 지원 (Batch or Lua 내부 원자성) |
Redisson은 Redis를 단순한 저장소가 아닌, 분산 시스템의 핵심 도구로 확장해준다. 특히 다양한 동시성 처리 도구와 캐시 전략, 복합 객체 구조를 제공해주기 때문에, 실제 비즈니스 로직을 보다 안정적이고 효율적으로 구성할 수 있다.