Redis

Aqua5·2025년 7월 29일

개념 정리

목록 보기
12/13

1. 레디스(Redis)란 무엇인가?

1-1. 레디스 정의 및 핵심 개념

레디스(Redis, REmote DIctionary Server)는 오픈 소스 기반의 인메모리(In-memory) 데이터 구조 저장소다. 데이터베이스, 캐시, 메시지 브로커 등 다용도로 활용되며, 데이터를 디스크가 아닌 주 메모리(RAM)에 저장하여 처리 속도가 매우 빠르다.

핵심적으로 레디스는 데이터를 Key-Value(키-값) 형태로 저장하는 비관계형(NoSQL) 데이터베이스 관리 시스템(DBMS)이다. 간단한 키에 문자열, 리스트, 해시 등 다양한 형태의 값을 연결하여 저장하고 조회할 수 있다.

1-2. 인메모리(In-memory) 데이터 스토어의 의미와 장점

인메모리 데이터 스토어는 데이터를 하드 디스크나 SSD가 아닌 컴퓨터의 주 메모리(RAM)에 저장하고 관리하는 방식이다.

  • 장점: 디스크 입출력(I/O) 과정에서 발생하는 병목 현상을 피해 데이터 읽기 및 쓰기 속도가 매우 빠르다. 평균 1밀리초 미만의 응답 시간으로 초당 수백만 건의 작업을 처리할 수 있어, 실시간 처리가 중요한 서비스에 적합하다.
  • 단점: RAM은 휘발성 메모리이므로 서버 전원이 꺼지면 데이터가 유실될 위험이 있다. 또한, 디스크에 비해 용량이 제한적이고 비용이 비싸다.

1-3. Key-Value 저장소 모델 소개

Key-Value 모델은 고유한 키(Key) 하나에 값(Value) 하나를 연결해 데이터를 저장하는 가장 단순한 데이터 저장 구조다.

  • 키(Key): 데이터를 식별하기 위한 고유한 문자열이다.
  • 값(Value): 키에 해당하는 데이터로, 단순한 텍스트나 숫자부터 리스트, JSON, 객체 등 복잡한 데이터 구조까지 저장할 수 있다.

이 모델은 구조가 단순하여 복잡한 쿼리가 필요 없고 속도가 빠르다는 장점이 있다.

2. 레디스의 핵심 특징과 아키텍처

2-1. 지원하는 다양한 자료구조

레디스는 다른 Key-Value 저장소와 달리 값으로 다양한 데이터 구조를 지원하여 개발 편의성을 높인다.

  • Strings: 가장 기본적인 형태로, 문자열, 숫자, 바이너리 데이터를 저장한다. 카운터나 간단한 캐시에 활용된다.
  • Lists: 순서가 있는 문자열의 컬렉션으로, 큐(Queue)나 스택(Stack)을 구현하는 데 용이하다.
  • Sets: 순서가 없는 고유한 문자열의 집합이다. 중복을 허용하지 않으므로 태그(Tag)나 사용자 ID 저장 등에 사용된다.
  • Sorted Sets: Set에 정렬을 위한 '스코어(score)'가 추가된 구조다. 스코어를 기준으로 자동 정렬되어 실시간 랭킹 보드를 쉽게 구현할 수 있다.
  • Hashes: 필드(field)와 값(value)으로 구성된 맵(Map) 구조로, 객체와 유사한 데이터를 저장하기에 적합하다.

이 외에도 Bitmaps, HyperLogLogs, Streams 등 특수한 목적의 자료구조를 지원한다.

2-2. 영속성(Persistence) 보장 방법: RDB와 AOF

레디스는 인메모리 DB의 단점인 데이터 유실을 방지하기 위해 데이터를 디스크에 저장하는 영속성(Persistence) 기능을 제공한다.

  • RDB (Redis Database): 특정 시점의 데이터 전체를 스냅샷 형태로 디스크에 저장하는 방식이다. 서버 재시작 시 이 파일을 읽어 데이터를 복구한다.
  • AOF (Append Only File): 모든 쓰기(write) 명령을 로그 파일에 순차적으로 기록하는 방식이다. RDB보다 데이터 유실 가능성이 적다.

2-3. 단일 스레드(Single-Threaded) 동작 방식과 원리

레디스는 한 번에 하나의 명령만 처리하는 단일 스레드(Single-Threaded) 방식으로 동작한다.

  • 원리: 모든 요청이 순서대로 처리되므로 동시성 문제(Race Condition)를 피할 수 있고, 별도의 잠금(Lock)이 필요 없어 구조가 단순하고 빠르다.
  • 주의점: 하나의 명령이 오래 걸리면 뒤따르는 모든 명령이 대기 상태에 빠지므로(Blocking), 시간이 많이 소요되는 무거운 명령은 피해야 한다.

2-4. 높은 성능의 비결: 비동기 I/O, 이벤트 기반 처리

레디스의 높은 성능은 여러 요소가 결합된 결과다.

  • 인메모리 구조: 모든 데이터를 RAM에서 처리하여 디스크 I/O 병목을 제거한다.
  • 단순한 데이터 모델: Key-Value 구조는 데이터 접근이 빠르고 간단하다.
  • 비동기 I/O (Non-blocking I/O): I/O 작업을 기다리지 않고 다른 작업을 먼저 처리하는 이벤트 기반 방식으로 리소스를 효율적으로 사용한다.

3. 레디스의 주요 활용 사례

3-1. 캐싱(Caching)

데이터베이스 부하를 줄이고 애플리케이션 응답 속도를 높이는 대표적인 용도다. 자주 조회되지만 변경은 적은 데이터를 레디스에 저장해두고, 메인 DB 대신 레디스에서 직접 데이터를 제공한다.

3-2. 세션 스토어(Session Store)

여러 서버로 확장된 웹 애플리케이션에서 사용자의 로그인 정보와 같은 세션 데이터를 모든 서버가 공유해야 할 때, 고속 중앙 세션 저장소로 널리 사용된다.

3-3. 실시간 시스템 구현

  • 랭킹 보드: Sorted Set 자료구조를 사용하면 사용자의 점수를 실시간으로 업데이트하고 순위를 매기는 시스템을 간단하게 구현할 수 있다.
  • 카운터: 게시물 조회수, '좋아요' 수 등을 Strings 자료구조의 원자적 연산(INCR)을 통해 빠르고 정확하게 집계할 수 있다.

3-4. 메시지 큐(Message Queue) 및 Pub/Sub

  • 메시지 큐: Lists 자료구조를 이용해 간단한 메시지 큐를 구현하여 비동기 작업을 처리할 수 있다.
  • Pub/Sub: 발행/구독(Publish/Subscribe) 모델을 지원하여 실시간 채팅, 알림 시스템 등을 구축하는 데 사용된다.

4. 파이썬(Python)을 이용한 레디스 연동

4-1. 개발 환경 준비: Redis 설치 및 실행

로컬 머신이나 서버에 Redis를 직접 설치하거나, 클라우드 서비스(예: AWS ElastiCache)를 통해 관리형 Redis를 사용할 수 있다.

4-2. 파이썬 라이브러리 redis-py 설치 및 연동

파이썬 표준 레디스 라이브러리인 redis-py는 pip을 통해 설치할 수 있다.

0개의 댓글