Data Structure(자료 구조)
String
Redis에서 가장 기본적인 자료구조로, key-value 방식으로 데이터를 저장하며, 문자열뿐만 아니라 이미지, JSON, 직렬화된 객체 등 다양한 데이터를 저장할 수 있다.
메모리 제한: 최대 512MB까지의 문자열 저장을 지원
명령어
INCR
/ INCRBY
/ DECR
/ DECRBY
숫자 값을 원자적으로 증가 또는 감소
INCR counter # 1
INCRBY counter 5 # 6
NX
옵션
지정한 키가 없을 때만 저장
SET key2 "value2" NX
XX
옵션
지정한 키가 있을 때만 값 업데이트
SET key1 "new_value" XX
MSET
여러 키의 값을 한 번에 설정
MSET key1 "value1" key2 "value2"
MGET
여러 키의 값을 한 번에 조회
MGET key1 key2
APPEND
기존 값에 데이터를 추가
APPEND key1 "suffix"
GETRANGE
문자열의 부분을 가져오기 (서브스트링)
GETRANGE key1 0 3
SETRANGE
문자열의 특정 위치부터 값을 설정
SETRANGE key1 6 "world"
활용 사례: 간단한 캐시 / 세션 관리 / 카운터(예: 방문자 수, 좋아요 수 등) 등
List
순서를 가지는 문자열 목록으로, 인덱스를 사용해 직접 접근할 수 있으며, 스택과 큐로 활용 가능하다.
메모리 제한: 하나의 리스트에 최대 42억여 개의 아이템 저장 가능
기능
LPUSH
/ RPUSH
리스트의 왼쪽 또는 오른쪽에 아이템 추가
LPUSH mylist "first"
RPUSH mylist "second"
LPOP
/ RPOP
리스트의 왼쪽 또는 오른쪽에서 아이템 제거
LPOP mylist
LRANGE
리스트의 범위를 조회
LRANGE mylist 0 -1
LINSERT
리스트의 특정 위치에 아이템 삽입
LINSERT mylist BEFORE "second" "middle"
LINDEX
/ LSET
리스트의 인덱스로 아이템 조회 및 수정
LINDEX mylist 1
LSET mylist 0 "new_value"
LTRIM
리스트의 범위를 잘라내어 저장 (자르기)
LTRIM mylist 0 99
BLPOP
/ BRPOP
리스트의 왼쪽 또는 오른쪽에서 아이템 블로킹 제거
BLPOP mylist 0
RPUSHX
리스트가 있을 때만 추가
RPUSHX mylist "value"
활용 사례: 메시지 큐 / 대기열 관리 / 채팅 로그 저장 / 이벤트 스트리밍 등
시간 복잡도
LPUSH
/RPUSH
/LPOP
/RPOP
: O(1)인덱스나 데이터를 이용한 중간 데이터 조회: O(N)
BLPOP
/ BRPOP
BLPOP
/ BRPOP
기존 RPOP
/ LPOP
명령어에 블로킹 기능을 추가한 명령어로, 리스트에 아이템이 추가될 때까지 대기하다가 아이템이 추가되면 해당 아이템을 반환한다.
BLPOP
/BRPOP
key [key ...] timeoutkey: 대상 리스트의 키
timeout: 블로킹 시간(초)
대기 시간 초과 시 nil 반환
리스트의 키와 아이템 값 반환
동시에 여러 리스트에서 가져올 수 있기 때문에, 가져온 값을 구분하기 위해 리스트의 키를 함께 반환
Hash
키 안에 또 다른 필드-값 쌍으로 구성된 데이터를 저장하는 자료구조로, 작은 객체나 테이블 데이터를 저장하는 데 적합하다.
명령어
HSET
필드-값 쌍 저장
HSET
user:1000 name "John"
HGET
필드 값 가져오기
HGET
user:1000 name
HMSET
여러 필드-값 쌍 설정
HMSET
user:1001 name "Alice" age 30
HDEL
필드 삭제
HDEL
user:1000 age
HEXISTS
필드 존재 여부 확인
HEXISTS
user:1000 name
HGETALL
모든 필드-값 쌍 조회
HGETALL
user:1000
활용 사례: 사용자 프로필 / 상품 정보 저장
Set
고유한 값들의 집합을 저장하며, 중복된 데이터를 허용하지 않으며 순서가 없는 데이터 저장에 적합하다.
명령어
SADD
값 추가
SADD
myset "apple" "banana"
SREM
값 제거
SREM
myset "apple"
SINTER
두 집합의 교집합
SINTER
myset yourset
SUnion
두 집합의 합집합
SUnion
myset yourset
SISMEMBER
값이 집합에 존재하는지 확인
SISMEMBER
myset "apple"
SMEMBERS
집합의 모든 값 조회
SMEMBERS
myset
활용 사례: 태그 저장 / 고유 사용자 저장 / 복권 번호 추첨
Sorted Set
Set과 유사하지만, 각 요소에 점수(score)를 부여해 자동으로 정렬된 상태로 저장하게 된다.
명령어
ZADD
요소와 점수 삽입
ZADD
leaderboard 100 "player1"
ZRANGE
인덱스 범위 내 요소 조회 WITHSCORES: 스코어 함께 출력 / REV: 역순 / BYLEX: 사전 순 정렬 / BYSCORES: 스코어 범위로 조회
ZRANGE
leaderboard 0 -1
ZREM
요소 삭제
ZREM
leaderboard "player1"
ZINCRBY
점수 값 증가
ZINCRBY
leaderboard 50 "player1"
ZSCORE
특정 요소의 점수 조회
ZSCORE
leaderboard "player1"
ZREVRANGE
높은 점수 순으로 정렬된 요소 조회
ZREVRANGE
leaderboard 0 -1
활용 사례: 리더보드 / 순위 계산 / 시간 기반 정렬된 이벤트 저장
시간 복잡도
인덱스를 통한 조회: O(logN)
Skip List
Sorted Set은 Skip List를 사용해 데이터를 관리하기 때문에 O(logN)의 시간복잡도로 데이터를 조회할 수 있다.
여러 레벨로 구성된 연결 리스트 구조
각 레벨에서 일부 노드만 연결되며, 상위 레벨일수록 노드 수가 적음
탐색할 때 최상위 레벨부터 시작하여, 원하는 값보다 큰 값이 나오는 지점에서 하위 레벨로 이동하여 탐색
Bitmaps
독자적인 자료 구조는 아니며, string 자료 구조에 bit 연산을 수행할 수 있도록 확장한 형태다.
메모리 제한: 2^32의 비트를 가지고 있는 비트맵 형태
명령어
SETBIT
비트 설정
SETBIT
pageviews 1 1
GETBIT
비트 값 조회
GETBIT
pageviews 1
BITCOUNT
비트 값이 1인 비트 개수 세기
BITCOUNT
pageviews
BITOP
비트 연산(AND, OR, XOR, NOT)
BITOP
AND result key1 key2
활용 사례: 이벤트 발생 여부 추적 / 월간 사용자 활성화 상태 / 플래그 저장
HyperLogLog
집합의 원소 개수인 카디널리티를 추정할 수 있는 자료 구조로, 대량 데이터에서 중복되지 않는 고유한 값을 집계할 때 사용한다.(카디널리티 추정 오차 약 0.81%)
메모리 제한: 최대 12KB 사용 / 최대 2^64개의 원소 저장 가능
명령어
PFADD
원소 추가
PFADD
visitors "user1" "user2"
PFCOUNT
고유 원소 개수 추정
PFCOUNT
visitors
PFMERGE
여러 HyperLogLog 병합
PFMERGE
total_visitors visitors1 visitors2
활용 사례: 대규모 사용자 방문 기록 / 이벤트 추적
Geospatial
지리적 좌표(longitude, latitude)를 저장하고, 반경 내의 위치 검색을 효율적으로 처리하는 자료구조.
명령어
GEOADD
좌표 추가
GEOADD
locations 13.361389 38.115556 "Palermo"
GEOSEARCH
좌표 조회(반경)
GEOSEARCH
locations FROMMEMBER "Palermo" BYRADIUS 100 km
GEODIST
두 지점 간 거리 계산
GEODIST
locations "Palermo" "Catania"
활용 사례: 근처 매장 찾기 / 배달 서비스에서의 위치 기반 검색
Stream
Redis Streams는 로그 데이터나 이벤트 스트리밍을 관리할 수 있는 자료구조로, 메시지 브로커로서 기능을 제공한다.
특징
각 메시지는 고유한 ID와 함께 저장되며, 시간순으로 정렬됨
소비자 그룹(consumer group)을 통해 여러 소비자가 데이터를 효율적으로 처리할 수 있음
데이터 손실 없이 대규모 메시지 스트리밍 처리 가능
이벤트가 발생할 때마다 자동으로 데이터를 추가하고, 필요 시 각 소비자가 처리한 위치를 추적할 수 있음
활용 사례: 실시간 로그 수집 / 이벤트 소싱 / 메시지 큐
참고자료
Last updated
Was this helpful?