cmod.ify
Redis 본문
1. 개요 및 주요 특징
Redis(Remote Dictionary Server)는 현대적인 아키텍처, 특히 마이크로서비스 아키텍처(MSA)에서 필수적인 역할을 수행하는 오픈 소스 인메모리 데이터 저장소이다.
- In-Memory Key-Value Store: 데이터를 디스크가 아닌 메모리에 저장하여 압도적인 처리 속도를 보장한다.
- Key-Value 구조:
- Key: 중복을 허용하지 않는 유일한 값이며 주로 String 형태를 띤다.
- Value: 다양한 데이터 타입을 지원하며, 기존 Key에 새로운 값을 덮어쓰는 Upsert 구조로 동작한다.
- 싱글 스레드(Single-Threaded): 한 번에 하나의 명령어만 처리함으로써 데이터 원자성을 보장하고 경합 상태(Race Condition)를 방지한다.
- 데이터 저장 분류:
- In-Memory DB: 메모리에 데이터를 저장하여 성능을 극대화한다.
- On-Disk DB: 파일 시스템(디스크)에 데이터를 저장하는 전통적인 DB 방식이다.
2. 고가용성(High Availability) 및 확장성
시스템 장애 상황에서도 서비스 중단 없이 운영될 수 있도록 다양한 기능을 제공한다.
- 고가용성(HA):
- 복제(Replication): 데이터를 여러 서버에 분산하여 복제본을 생성한다.
- Sentinel(센티널): 마스터 서버를 실시간 감시하며, 장애 발생 시 복제본을 마스터로 승격시키는 Fail-over(장애 조치)를 자동 수행한다.
- 확장성(Scalability):
- Cluster Mode: 데이터를 여러 노드에 나누어 저장하는 Sharding(샤딩) 기술을 통해 수평적 확장이 용이하다. 데이터 분산 처리는 데이터베이스 레이어에서 직접 담당한다.
3. MSA 환경에서의 Redis 활용
- 영속성(Persistence): 메모리 기반의 휘발성 문제를 해결하기 위해 AOF(Append Only File)와 RDB(Redis Database) 방식을 통해 주기적으로 파일 시스템에 데이터를 저장한다.
- Message Broker: 내장된 pub/sub 기능을 통해 서비스 간 메시지 전달이나 실시간 알림 서비스에 활용된다.
- Event Loop: 효율적인 이벤트 처리 모델을 기반으로 동작한다.
4. 주요 사용 사례 (Use Cases)
- Caching: DB 앞단에 배치하여 액세스 지연 시간을 줄이고 전체 시스템의 처리량을 높인다. 중앙 집중형 캐시 구성을 통해 MSA 환경에서 데이터 일관성을 유지할 수 있다.
- 세션 관리: 게임, 커머스, 소셜 미디어 등의 사용자 세션 정보를 안정적으로 관리한다.
- 실시간 순위표: z 접두사가 붙는 자료구조를 활용하여 데이터 저장과 동시에 점수 기준 정렬을 수행한다.
- 분산 락(Distributed Lock): 여러 서버가 공유 자원에 접근할 때 발생하는 동시성 문제를 제어한다.
- 속도 제한(Rate Limiting): 이벤트 발생 속도를 측정하고 제어한다.
5. 아키텍처 구성
- Redis Sentinel 아키텍처: Sentinel, Master, Replica로 구성된다. Sentinel이 평상시 Master와 Replica를 관리하며, Master 장애 시 Replica를 새로운 Master로 전환한다.
- 클러스터 모드(Cluster Mode): Master와 Replica를 하나의 그룹으로 묶어 대규모 시스템을 운영하는 방식이다.
Redis 설치 및 접속 가이드
1. Redis 설치 방법
Redis를 설치하는 방법은 환경과 목적에 따라 크게 세 가지로 나뉜다.
- Public Cloud 서비스 이용: AWS(ElastiCache), GCP(Memorystore) 등 주요 클라우드 벤더가 제공하는 관리형 상품을 사용한다.
- Docker 컨테이너 이용: Docker 환경 위에서 Redis 이미지를 실행하여 독립적인 컨테이너로 구동한다.
- 직접 설치 (Local 설치):
- Windows (WSL): PowerShell을 통해 WSL(Windows Subsystem for Linux)을 설치한 후, Ubuntu 환경에서 apt 패키지 관리자를 이용해 설치한다.
- MSI 파일 이용: GitHub의 Microsoft Archive 저장소에서 .msi 설치 파일을 다운로드하여 설치한다. (본 실습에서는 Docker 학습 전 단계로, GitHub에서 다운로드한 CLI 버전을 활용함)
- http://github.com/microsoftarchive/redis/releases
2. 주요 네트워크 설정
- 기본 포트(Port): 일반적으로 6379 포트를 사용한다.
- 클러스터 모드: 클러스터 모드로 운영될 경우 기본 포트에 10000을 더한 16379 포트를 통해 노드 간 통신을 수행한다.
- 구성 요소: Redis 서버를 구동하는 redis-server와 실제 명령어를 입력하여 작업을 수행하는 전용 클라이언트인 redis-cli로 나뉜다.
3. Redis 접속 및 상태 확인
설치 시 제공되는 redis-cli를 이용하여 서버에 접속한다.
- 접속 명령어:
- IP 주소: 생략 시 기본값은 127.0.0.1(로컬 호스트)이다.
- 포트 번호: 생략 시 기본값은 6379이다.
- 패스워드: 보안 설정이 되어 있는 경우에만 -a 옵션을 사용하여 입력한다.
redis-cli -h <IP주소> -p <포트번호> -a <패스워드>
- 연결 확인: 접속 후 ping 명령어를 입력했을 때, 서버로부터 PONG이라는 응답이 돌아오면 정상적으로 연결된 상태이다.
참고: 현재는 학습 초기 단계로 Docker를 도입하기 전이기에 GitHub에서 제공하는 실행 파일을 통해 실습을 진행하였으며, 향후 Docker 컨테이너를 활용한 배포 방식으로 확장할 계획이다.
Redis 기본 명령어 및 데이터 관리
Redis는 명령어를 통해 인메모리 데이터를 직접 제어하며, 데이터의 저장, 조회, 삭제뿐만 아니라 효율적인 메모리 관리를 위한 유효 기간 설정 기능을 제공한다.
1. 기본 데이터 조작 (CRUD)
- 데이터 단일 저장 및 조회:
- SET: 특정 키(Key)에 데이터를 저장한다.
- 예: SET "a" "hapi"
- GET: 키에 해당하는 데이터를 읽어온다. 이때 키는 대소문자를 엄격히 구분하며, 존재하지 않는 키를 조회할 경우 nil(존재하지 않음)을 반환한다.
- 예: GET "a"
- SET: 특정 키(Key)에 데이터를 저장한다.
- 데이터 삭제:
- DEL: 지정한 키와 그에 해당되는 데이터를 삭제한다.
- 예: DEL "a"
- DEL: 지정한 키와 그에 해당되는 데이터를 삭제한다.
2. 다중 데이터 처리 및 키 탐색
- 데이터 다중 저장 및 조회:
- MSET: 여러 개의 키와 값을 한 번에 저장한다.
- 예: MSET "a" "hapi" "b" "happy"
- MGET: 여러 개의 키에 해당하는 값을 한 번에 조회한다.
- 예: MGET "a" "b"
- MSET: 여러 개의 키와 값을 한 번에 저장한다.
- 키 탐색:
- KEYS: 특정 패턴에 일치하는 모든 키를 조회한다. KEYS * 사용 시 현재 저장된 모든 키를 확인할 수 있으나, 데이터 양이 많을 경우 성능 저하를 초래할 수 있다.
- SCAN: 일정 수의 키를 커서(Cursor) 기반으로 반복 조회한다. 서버에 부하를 주지 않고 안전하게 키를 탐색할 때 사용한다.
- 예: SCAN 0 (첫 번째 커서부터 탐색 시작)
3. 유효 기간(TTL) 설정 및 메모리 관리
Redis의 가장 큰 장점 중 하나는 데이터마다 유효 기간을 설정할 수 있다는 점이다. 기간이 만료된 데이터는 자동으로 메모리에서 삭제되므로, 별도의 관리 작업 없이도 메모리를 효율적으로 유지할 수 있다.
- EXPIRE: 이미 존재하는 키에 초 단위로 유효 기간을 설정한다.
- 예:
-
SET "c" "lee" EXPIRE "c" 30 - 위와 같이 설정하면 30초가 지난 후 GET "c"를 실행했을 때 데이터가 삭제되어 nil이 반환된다.
Redis 주요 자료구조(Data Structures)
Redis는 용도에 따라 선택할 수 있는 다양한 자료구조를 지원한다. 각 자료형의 핵심 명령어와 특징을 정리한다.
1. String (문자열)
가장 기본이 되는 자료구조로, 최대 512MB의 데이터를 저장할 수 있다.
- 핵심 기능
- 삽입: SET key value (데이터 저장/수정)
- 조회: GET key (데이터 읽기, 없으면 nil 반환)
- 삭제: DEL key (데이터 삭제)
- 부가 기능 및 옵션
- NX: 키가 없을 때만 저장 / XX: 키가 있을 때만 수정.
- 숫자 연산: INCR, INCRBY를 통해 정수형 데이터를 간편하게 증감할 수 있다.
2. List (리스트)
순서를 가진 문자열 목록이며, 양방향 연결 리스트(Deque) 형태로 동작한다.
- 핵심 기능
- 삽입: LPUSH (왼쪽 삽입), RPUSH (오른쪽 삽입)
- 조회: LRANGE start stop (인덱스 범위 조회, -1은 맨 끝을 의미)
- 삭제: LPOP (왼쪽 추출), RPOP (오른쪽 추출), LTRIM (범위 외 데이터 제거)
- 부가 기능
- LINSERT: BEFORE 또는 AFTER 옵션으로 특정 데이터 앞뒤에 삽입.
- LSET: 특정 인덱스의 데이터를 수정.
- LINDEX: 특정 인덱스의 데이터를 조회 (O(n) 소요).
3. Hash (해시)
하나의 키 내부에 여러 개의 필드와 값의 쌍을 저장하는 구조이다.
- 핵심 기능
- 삽입: HSET key field value (필드 단위 저장)
- 조회: HGET (특정 필드 조회), HGETALL (전체 필드 조회)
- 삭제: HDEL key field (특정 필드 삭제)
- 부가 기능
- HLEN: 해당 해시에 저장된 필드의 개수를 반환한다.
- 객체 형태의 데이터를 저장할 때 메모리 효율이 매우 뛰어나다.
4. Set (셋)
순서가 없으며 중복을 허용하지 않는 데이터 집합이다.
- 핵심 기능
- 삽입: SADD key member (데이터 추가, 중복 데이터는 자동 무시)
- 조회: SMEMBERS key (전체 데이터 조회)
- 삭제: SREM (특정 데이터 제거), SPOP (무작위 데이터 제거)
- 부가 기능
- 집합 연산: SUNION(합집합), SINTER(교집합), SDIFF(차집합)를 통해 복잡한 데이터 간의 관계를 계산할 수 있다.
5. Sorted Set (정렬된 셋)
값과 함께 스코어(Score)를 저장하며, 스코어 기준으로 자동 정렬되는 집합이다.
- 핵심 기능
- 삽입: ZADD key score member
- 조회: ZRANGE (인덱스 기준 조회), ZRANGEBYSCORE (스코어 범위 기준 조회)
- 삭제: ZREM key member (특정 멤버 삭제)
- 부가 기능
- 효율성: 인덱스 기반 접근 시 O(\log n)의 성능을 보여 List보다 빠르다.
- 옵션: GT/LT를 사용해 조건부 스코어 업데이트가 가능하다.
- XX 존재하는 경우 스코어 업데이트
- NX 존재하지 않을 때만 삽입
- LT 업데이트하고자 하는 스코어가 기존 아이템의 스코어보다 작을 때에만 업데이트, 기존 아이템 존재하지 않으면 삽입
- GT 업데이트하고자 하는 스코어가 기존 아이템의 스코어보다 클 때에만 업데이트, 기존 아이템 존재하지 않으면 삽입
6. 특수 목적 자료구조 (Advanced)
- Hyperloglog: 실제 데이터를 저장하지 않고 고유 값의 개수(카디널리티)만 추정한다. 대용량 데이터에서 메모리를 거의 쓰지 않고 중복 제거 카운트를 할 때 사용한다. (PFADD, PFCOUNT)
- Geospatial: 위도, 경도 좌표를 저장하며 내부적으로 Sorted Set을 활용한다. (GEOADD, GEODIST)
- Bitmap: 문자열을 비트(bit) 단위로 취급하여 0과 1로 상태를 기록한다.
- Stream: 카프카(Kafka)와 유사한 소비자 그룹 개념을 도입하여 메시징 브로커 역할을 수행한다.
Redis 키(Key) 관리 전략 및 주요 명령어
Redis 운영의 핵심은 키를 효율적으로 생성하고, 안전하게 조회하며, 메모리를 관리하는 것이다.
1. 키의 자동 생성 및 삭제 메커니즘
Redis는 복합 자료구조(Stream, Set, Sorted Set, Hash, List)를 다룰 때 사용자의 편의를 위해 자동 관리 기능을 제공한다.
- 자동 생성: 존재하지 않는 키에 아이템을 삽입하면, 해당 자료구조를 먼저 생성한 후 데이터를 저장한다.
- 자동 삭제: 자료구조 내의 모든 아이템을 삭제하면 해당 키도 메모리에서 자동으로 제거된다. (단, Stream은 예외적으로 아이템이 없어도 키가 유지될 수 있다.)
- 주의 사항: 이미 생성된 키에 다른 자료구조 전용 명령어를 사용하면 에러가 발생한다. (예: String 타입인 키에 LPUSH 실행 시 에러)
- 빈 키 처리: 존재하지 않는 키에 대해 크기 조회(LLEN)나 삭제(LPOP)를 수행하면 에러가 발생하는 대신, 데이터가 없는 상태처럼 동작한다.
2. 키 조회 및 패턴 매칭
키를 검색할 때는 와일드카드를 활용한 패턴 매칭이 가능하다.
- h?llo: hello, hallo 등 1글자 와일드카드 매칭
- h*llo: hllo, heeeello 등 글자 수 상관없는 매칭
- h[ae]llo: hallo 또는 hello 매칭
- h[^e]llo: hello를 제외한 매칭
3. KEYS vs SCAN: 성능과 안정성
- KEYS (위험): KEYS *와 같이 모든 키를 조회하는 명령은 매우 위험하다. Redis는 싱글 스레드로 동작하므로, 키가 수백만 개일 경우 조회하는 동안 다른 모든 명령이 차단된다. 이로 인해 타임아웃 발생, 응답 지연, 의도치 않은 페일오버(Fail-over)가 발생할 수 있다.
- SCAN (권장): 커서(Cursor) 기반으로 키를 부분적으로 조회한다. 한 번에 모든 데이터를 가져오지 않고 지정된 COUNT만큼씩 나누어 조회하므로 서버에 부하를 주지 않는다.
4. 키 관리 주요 명령어
| 명령어 | 설명 | 비고 |
| EXISTS | 키의 존재 여부 확인 | 존재 시 1, 미존재 시 0 반환 |
| TYPE | 키의 자료구조 타입 확인 | string, list, set 등 반환 |
| RENAME | 키 이름 변경 | RENAME old new |
| COPY | 키 복제 | REPLACE 옵션 사용 시 기존 키 덮어쓰기 가능 |
| SORT | 아이템 정렬 | ALPHA 옵션으로 문자열 정렬 가능 |
| TTL | 만료 시간 확인 | 유효시간 없음(-1), 키 없음(-2) |
| FLUSHALL | 전체 데이터 삭제 | 전체 키를 삭제하므로 주의 필요 |
5. 데이터 삭제: DEL vs UNLINK
- DEL: 동기(Sync) 방식으로 데이터를 즉시 삭제한다. 데이터가 매우 크면 삭제하는 동안 서버가 차단될 수 있다.
- UNLINK: 비동기(Async) 방식으로 키를 먼저 연결 해제한 후, 실제 삭제는 백그라운드에서 처리한다. 대용량 데이터를 안전하게 삭제할 때 권장된다.
'BASIC > DATABASE' 카테고리의 다른 글
| MongoDB (3) | 2026.01.05 |
|---|---|
| 파이썬 & MariaDB 연동 (1) | 2025.12.30 |
| 트리거, 인덱스, 백업, 프로시저 (0) | 2025.12.30 |
| 가상 테이블 (0) | 2025.12.30 |
| DML & TCL (0) | 2025.12.29 |