레디스의 자료 구조
string
- 기본 특징
- Redis의 String 타입은 최대 512MB까지 저장할 수 있다.
- Redis는 Key-Value Store이며, 하나의 키에는 하나의 값만 저장된다. → 일대일 매핑 구조
- 키 저장 옵션
- NX: 키가 없을 때만 새로운 키를 저장
- XX: 키가 이미 있을 때만 값 갱신 (새로운 키 생성 X)
- 숫자 연산
- 숫자 형태로도 저장 가능
- 원자적(Atomic) 연산 제공 → 동시성 이슈 없음
- INCR: 값을 1 증가
- INCRBY {key} {n}: 값을 n만큼 증가
- (유사하게 DECR, DECRBY도 있음)
- 다중 키 연산
- MSET key1 val1 key2 val2 ... → 여러 키-값을 한 번에 저장
- MGET key1 key2 ... → 여러 값을 한 번에 가져오기
- 네트워크 왕복 횟수를 줄여 성능 최적화 가능
list
- 기본 특징
- 순서를 가지는 문자열의 목록
- 하나의 List에 최대 약 42억 개 아이템 저장 가능
- 스택(Stack), 큐(Queue) 구조로 활용 가능
- 주로 로그 저장, 메시지 큐 등에 사용됨
- 주요 명령어
(1) 데이터 추가
- LPUSH key value → 리스트의 왼쪽(앞)에 데이터 추가
- RPUSH key value → 리스트의 오른쪽(뒤)에 데이터 추가
(2) 데이터 조회
- LRANGE key start end → 지정한 범위의 데이터 조회
- (Ex. LRANGE mylist 0 -1 → 전체 조회)
- LINDEX key index → 특정 인덱스 데이터 확인
(3) 데이터 수정/삽입
- LSET key index value → 특정 인덱스 데이터 덮어쓰기
- LINSERT key BEFORE|AFTER pivot value → 특정 데이터 앞/뒤에 삽입
(4) 데이터 삭제
- LTRIM key start end → 지정한 범위 외 데이터 모두 삭제
- (반환값 없음, 내부에서 리스트를 잘라내는 방식)
- 로그 저장 활용 예시
- 로그 데이터는 주기적으로 삭제해 저장 공간 확보가 필요함 (Ex. 최대 1000개 로그 유지하기)
LPUSH logdata <data> # 로그 추가
LTRIM logdata 0 999 # 인덱스 0~999만 남기고 나머지는 삭제
- 주의: 데이터 개수가 1001개가 되기 전까지는 LTRIM 동작하지 않음
Hash
- 기본 특징
- 필드(Field)-값(Value) 쌍으로 구성된 자료구조
- 하나의 키 안에 여러 개의 필드-값 쌍을 저장 가능
- 각 아이템은 서로 다른 필드를 가질 수 있으며, 동적으로 필드 추가 가능
- 주로 객체(사용자 정보, 상품 정보 등) 저장에 적합
- 주요 명령어
(1) 데이터 저장
- HSET key field value → 특정 필드에 값 저장
- HSET key field1 value1 field2 value2 ... → 여러 필드-값 쌍을 한 번에 저장
(2) 데이터 조회
- HGET key field → 특정 필드 값 조회
- HMGET key field1 field2 ... → 여러 필드 값 조회
- HGETALL key → 모든 필드-값 쌍 조회 (필드와 값이 순서대로 반환됨)
HSET user:1001 name "홍길동" age "25" email "hong@test.com"
HGET user:1001 name
# 결과: "홍길동" → user:1001 해시에서 name 필드 값 조회
HMGET user:1001 name age
# 결과: "홍길동" "25" → user:1001 해시에서 name, age 필드 값 동시 조회
HGETALL user:1001
# 결과: name 홍길동 age 25 email hong@test.com
# → user:1001 해시에 저장된 모든 필드-값 쌍 조회
Set
- 기본 특징
- 정렬되지 않은 문자열의 집합
- 중복 불가 → 유일한 원소만 저장
- 주로 객체 간 관계 계산, 중복 제거, 멤버 관리 등에 사용
- 주요 명령어
(1) 데이터 저장 및 조회
- SADD key member1 member2 ... → 아이템 추가
- SMEMBERS key → Set에 저장된 전체 아이템 조회 (순서 랜덤)
(2) 데이터 삭제
- SREM key member → 특정 아이템 삭제
- SPOP key [count] → 랜덤으로 아이템 삭제 후 반환 (count 지정 가능)
(3) 집합 연산
- SINTER key1 key2 ... → 교집합 계산
- SUNION key1 key2 ... → 합집합 계산
- SDIFF key1 key2 ... → 차집합 계산
sorted Set
- 기본 특징
- 스코어(score) 값에 따라 정렬되는 고유한 문자열의 집합
- 아이템 저장 시 스코어 값으로 자동 정렬
- 같은 스코어를 가진 아이템은 사전 순(lexicographical order)으로 정렬
- 중복 아이템 저장 불가
- 주요 명령어
(1) 데이터 추가
- ZADD key [옵션] score member [score member ...] → 스코어-값 쌍으로 아이템 저장
- NX → 아이템이 없을 때만 신규 삽입
- XX → 아이템이 있을 때만 스코어 업데이트
- LT → 기존 스코어보다 작을 때만 업데이트
- GT → 기존 스코어보다 클 때만 업데이트
(2) 데이터 조회
- ZRANGE key start stop [옵션] → 범위 조회
- 기본: 인덱스로 조회
- WITHSCORES: 스코어와 함께 조회
- REV: 역순 조회
- BYSCORE: 스코어 기준 조회
- BYLEX: 스코어 동일 시 사전 순 조회
- LIMIT offset count: 조회 개수 제한
- 인덱스 기반 조회
기본적으로 인덱스로 범위를 지정하여 조회
- WITHSCORES: 스코어와 함께 조회
- REV: 역순으로 조회
- 스코어 기반 조회
BYSCORE 옵션을 사용하여 스코어 범위로 조회
- 스코어에 ' ( ' 문자를 추가하면 해당 스코어 포함하지 않음
- +inf: 입력한 스코어보다 큰 모든 값 조회
- 역순 조회 시 최솟값과 최댓값 순서 변경
- 사전 순(lexicographical) 조회
- 스코어가 같은 아이템이 있을 때, BYLEX 옵션 사용
- 사전 순으로 특정 범위 아이템 조회 가능
비트맵(Bitmap)
string 자료 구조에 bit 연산을 수행할 수 있도록 확장한 형태
데이터를 비트 단위로 저장하기 때문에 저장 공간을 획기적으로 줄일 수 있음
- 주요 명령어
- SETBIT : 비트를 저장 (특정 오프셋 위치에 0 또는 1 설정)
- GETBIT : 저장된 비트를 조회 (특정 오프셋 위치의 값을 반환)
- BITFIELD : 여러 비트를 한 번에 설정하거나 조회
주로 대규모 상태(Ex. 사용자 로그인 여부, 방문 기록, 플래그 데이터 등)를 효율적으로 저장하고 빠르게 조회해야 하는 경우에 사용
HyperLogLog
- 기본 특징
- 집합의 고유 원소 개수(카디널리티)를 추정하는 확률적 자료 구조
- 대량 데이터에서 중복되지 않는 고유한 값의 개수 집계에 사용
- 입력 데이터를 직접 저장하지 않고 확률적 알고리즘으로 처리
- 최대 12KB의 공간 사용
- 추정 오차율 약 0.81%
- 주요 명령어
- PFADD: HyperLogLog에 아이템 저장
- PFCOUNT: 저장된 아이템의 고유 개수(카디널리티) 추정
Geospatial
- 기본 특징
- 경도, 위도 데이터 쌍의 집합으로 지리 데이터 저장
- 내부적으로 sorted set으로 관리
- 하나의 자료 구조 안에 키 중복 불가
- 주요 명령어
- GEOADD: <key> 경도 위도 member 순서로 데이터 저장
- GEOPOS: 저장된 위치 데이터 조회
- GEODIST: 두 아이템 간 거리 반환
- GEOSEARCH: 특정 위치 기준으로 거리 내 아이템 검색
- BYRADIUS: 반경 기준
- BYBOX: 직사각형 기준
Stream
- 기본 특징
- 레디스를 메시지 브로커로 활용할 수 있는 자료 구조
- 카프카와 유사한 소비자 그룹 개념 존재
- 데이터는 계속 추가되는 방식으로 저장
- 실시간 이벤트, 로그 데이터 저장에 적합
- 주요 명령어
- XADD: 스트림에 데이터 추가
- XRANGE: 특정 범위의 데이터 조회
- XREAD: 스트림 데이터 읽기
- XGROUP: 소비자 그룹 생성 및 관리
- XACK: 소비자 그룹에서 처리 완료된 메시지 확인
레디스에서 키를 관리하는 법
1. 키의 자동 생성과 삭제
- 키가 없을 때 아이템 삽입 시 빈 자료 구조 자동 생성
- 모든 아이템 삭제 시 키 자동 삭제 (단, stream은 예외)
- 키가 없는 상태에서 삭제·조회 명령 시 에러 없이 빈 자료 구조처럼 동작
──────────────────────────
2. 키 관련 주요 명령어
(1) 키 조회
- EXISTS: 키 존재 여부 확인 (존재 1, 없음 0)
- KEYS: 저장된 모든 키 조회 (패턴 사용 가능)
- h?llo → hello, hallo
- h*llo → heeeello 등
- h[ae]llo → hello, hallo
- h[^e]llo → hallo, hbllo
- h[a-b]llo → hallo, hbllo
- SCAN: 커서 기반 키 조회 (KEYS 대체용, 성능 향상)
- SSCAN / HSCAN / ZSCAN: 각각 set, hash, sorted set 전용
- SORT: list, set, sorted set 내 아이템 정렬
- 문자열 정렬 시 ALPHA 옵션 사용
- RENAME / RENAMENX: 키 이름 변경
- COPY: 기존 키를 새로운 키로 복사
- TYPE: 키의 자료 구조 타입 조회
- OBJECT: 키의 상세 정보 조회
──────────────────────────
(2) 키 삭제
- FLUSHALL: 모든 키 삭제
- DEL: 키와 데이터 삭제 (동기 처리)
- UNLINK: 백그라운드에서 키 삭제 (비동기, 우선 연결 해제)
──────────────────────────
(3) 키 만료 시간 관리
- EXPIRE: 만료 시간(초 단위) 설정
- NX: 기존 만료 시간 없음 → 설정
- XX: 기존 만료 시간 있음 → 갱신
- GT: 기존 만료 시간보다 클 때만 설정
- LT: 기존 만료 시간보다 작을 때만 설정
- EXPIREAT: 특정 유닉스 타임스탬프로 만료 설정
- EXPIRETIME: 만료될 유닉스 타임스탬프 반환
- TTL: 만료까지 남은 시간(초 단위) 반환
'Study Notes > 개발자를 위한 레디스' 카테고리의 다른 글
| [개발자를 위한 레디스] 6장 레디스를 메시지 브로커로 사용하기 (0) | 2025.11.15 |
|---|---|
| [개발자를 위한 레디스] 5장 레디스를 캐시로 사용하기 (0) | 2025.11.10 |
| [개발자를 위한 레디스] 4장 레디스 자료 구조 활용 사례 (0) | 2025.11.03 |
| [개발자를 위한 레디스] 2장 레디스 시작하기 (2) | 2025.08.27 |
| [개발자를 위한 레디스] 1장 마이크로서비스 아키텍처와 레디스 (0) | 2025.08.13 |