Redis 알아보기

klmin·2024년 12월 8일

Redis란?

Redis(Remote Dictionary Server)는 메모리 기반 데이터 저장소로 주로 캐시로 사용되거나 빠른 데이터 접근이 필요한 상황에서 활용된다. Redis는 NoSQL 데이터베이스의 일종으로 데이터를 키-값 구조로 저장하며 다양한 데이터 구조를 지원한다.

Redis의 주요 특징

  1. 메모리 기반
    Redis는 데이터를 메모리에 저장하므로 디스크 I/O를 사용하는 데이터베이스보다 매우 빠르다.
    이 특성 덕분에 높은 처리 속도가 요구되는 환경에서 많이 사용된다.

  2. 다양한 데이터 타입 지원
    Redis는 단순한 문자열뿐만 아니라 여러 데이터 구조를 제공한다.

    • String : 단순한 키-값 쌍
    • Hash : 필드와 값의 집합 (예: 객체처럼 사용 가능)
    • List : 순서가 있는 값의 리스트
    • Set : 유니크한 값의 집합
    • Sorted Set : 점수(score)와 함께 정렬된 집합
    • Stream, HyperLogLog, Bitmaps 등
  3. 데이터 지속성
    Redis는 메모리 기반이지만 데이터를 영구적으로 저장할 수 있는 옵션을 제공한다.

    • RDB : 주기적으로 메모리 데이터를 스냅샷으로 저장
    • AOF : 모든 쓰기 작업을 로그로 저장해 복구 가능
  4. 분산 처리
    Redis는 클러스터링 기능을 지원하여 대규모 분산 환경에서 데이터 처리를 할 수 있다.

  5. 초고속 성능
    Redis는 초당 수십만 건의 읽기/쓰기 작업을 처리할 수 있으며 지연 시간이 낮아 실시간 애플리케이션에 적합하다.

주요 활용 사례

  1. 캐싱
    가장 일반적인 사용 사례로 Redis는 API 응답, DB 쿼리 결과 등을 캐싱하여 성능을 향상시킬 수 있다.

  2. 세션 관리
    사용자 로그인 상태나 세션 데이터를 Redis에 저장하여, 빠른 액세스를 보장한다.

  3. 실시간 분석
    Redis의 빠른 읽기/쓰기 성능 덕분에 실시간 데이터 처리 및 분석에 사용된다.

  4. 메시지 큐
    Redis는 Pub/Sub 기능을 통해 메시지 큐로 사용할 수 있다. 또한, Stream을 사용해 더 복잡한 메시징 시스템을 구현할 수 있다.

  5. 랭킹 및 리더보드
    Sorted Set을 사용해 점수 기반 랭킹 시스템을 구축할 수 있다.

Windows10에서 Redis 설치 및 설정 방법 알아보기

Redis의 데이터 구조와 사용법

  1. String
    가장 기본적인 데이터 타입으로 단순한 키-값 쌍을 저장한다.
기본구문)

- 저장 : SET key value
- 조회 : GET key 
- 제거 : DEL key
- 유효시간 설정(초) : SET key value EX seconds

예시)

- 저장 : set test 1234
- 조회 : get test
- 제거 : del test
- 유효시간 설정 : set testkey testvalue EX 60

  1. Hash
    필드와 값을 저장할 수 있는 구조로 객체처럼 활용 가능하다
기본구문)

- 저장 : HSET key field value
- 필드 조회 : HGET key field
- 전체조회 : HGETALL key
- 필드 제거 : HDEL key field
- 키 제거 : DEL key


예시)

- 저장 : HSET user:1 name "John" age "30"
- 필드 조회 : HGET user:1 name
- 전체 조회 : HGETALL user:1
- 필드 제거 : HDEL user:1 age
- 키 제거 : DEL user:1

  1. List
    순서가 있는 값의 리스트로 큐(queue) 또는 스택(stack)처럼 사용할 수 있다.
기본 구문)

- 왼쪽에 추가(인덱스 첫번째) : LPUSH key value
- 오른쪽에 추가(인덱스 마지막) : RPUSH key value
- 전체 조회 : LRANGE key 0 -1 
- 인덱스 조회 : LINDEX key index
- 인덱스 범위 조회 : LINDEX key start end
- 왼쪽에서 값 제거 : LPOP key 
- 오른쪽에서 값 제거 : RPOP key

예시)

- 왼쪽에 추가(인덱스 첫번째) : LPUSH tasks "task1" "task2"
- 오른쪽에 추가(인덱스 마지막) : RPUSH tasks "task4"
- 전체 조회 : LRANGE tasks 0 -1 
- 인덱스 조회 : LINDEX tasks 1
- 인덱스 범위 조회 : LINDEX tasks 0 1
- 왼쪽에서 값 제거 : LPOP tasks 
- 오른쪽에서 값 제거 : RPOP tasks





  1. Set
    중복 없는 값의 집합을 저장할 수 있다.
기본 구문)

- 추가 : SADD key value
- 조회 : SMEMBERS key
- 값 존재 확인(1이면 존재, 0이면 존재하지 않음) : SISMEMBER key
- 값 제거 : SREM key

예시)

- 추가 : SADD myset value1
- 조회 : SMEMBERS myset
- 값 존재 확인 : SISMEMBER myset value1
- 값 제거 : SREM myset value1



  1. Sorted Set
    값에 점수를 추가하여 정렬된 형태로 저장한다.
기본 구문)

- 추가 : ZADD key field value
- 조회(전체 키) : ZRANGE key 0 -1 WITHSCORES
- 조회(키, 값 모두) : ZRANGE key start stop [WITHSCORES]
- 특정 범위 조회 : ZRANGEBYSCORE key start end
- 값 제거 : ZREM key field

예시)

- 추가 : ZADD scores 100 "player1"
- 조회(전체 키) : ZRANGE scores 0 -1 WITHSCORES
- 조회(키, 값 모두) : ZRANGE scores 0 -1 [WITHSCORES]
- 특정 범위 조회(100점 이상 200점 이하) : ZRANGEBYSCORE scores 100 200
- 값 제거 : ZREM scores "player1"

  1. 타입 확인
    key의 타입을 확인할 수 있다.
기본 구문)

type key

예시)

type test

Redis의 TTL(Time-To-Live) 관리

Redis는 키별 유효 시간을 설정하여 자동으로 데이터를 삭제할 수 있다.

  • 주요명령어
    • EXPIRE key seconds : 초 단위 TTL 설정
    • PEXPIRE key milliseconds : 밀리초 단위 TTL 설정
    • EXPIREAT key timestamp : 특정 시점에 만료 설정 (UNIX 타임스탬프 사용)
    • TTL key : 남은 TTL 확인 (초 단위)
    • PTTL key : 남은 TTL 확인 (밀리초 단위)
기본 구문)

유효시간 설정 : SET key value EX seconds
유효시간 확인 : TTL key

예시)

유효시간 설정 : SET user:1 "active" EX 60
유효시간 확인 : TTL user:1

Redis의 데이터 지속성

Redis는 메모리 기반이지만 데이터를 영구적으로 보존하기 위한 두 가지 주요 방법을 제공한다.

  1. RDB (Redis Database Snapshot)
    특정 시점에 메모리 데이터를 디스크로 스냅샷 저장한다.
    CPU 사용량이 적고, 읽기 속도가 빠르다.

    명령어: SAVE, BGSAVE

  2. AOF (Append Only File)
    모든 쓰기 작업을 로그 형태로 디스크에 저장한다.
    데이터 복구가 더 정확하지만 디스크 I/O 비용이 증가한다.

    명령어: BGREWRITEAOF

    방법특징장점단점
    RDB특정 시점에 데이터 스냅샷 저장CPU 사용량 적음, 빠른 읽기복구 시 데이터 유실 가능
    AOF모든 쓰기 작업을 로그에 기록데이터 복구 정확성 높음디스크 I/O 비용 증가

Redis 클러스터와 고가용성

  1. Redis 클러스터
    데이터를 여러 노드에 분산 저장하며 샤딩(sharding)을 통해 확장성을 제공한다.
    • 샤딩 : 데이터를 여러 개의 작은 단위(Shard)로 나누어 분산 시스템에서 관리하는 방법이다. 데이터를 한 곳에 집중적으로 저장하지 않고 여러 노드에 나누어 저장함으로써 확장성(Scalability)과 성능을 개선한다.

      샤딩 예시 (해시 기반 샤딩)

      만약 Redis 클러스터가 3개의 노드로 구성되어 있다면 다음과 같이 데이터를 분산 저장한다.
      - hash(userId) % 3 == 0 → Node 1에 저장
      - hash(userId) % 3 == 1 → Node 2에 저장
      - hash(userId) % 3 == 2 → Node 3에 저장
  1. Redis Sentinel
    고가용성을 위한 기능으로 마스터 장애 발생 시 자동으로 슬레이브를 마스터로 승격한다.

    Redis Sentinel 기본 구조 및 동작 예시

    • 구성요소

      • 마스터 노드
        • 클라이언트의 읽기와 쓰기 요청을 처리하는 주요 노드.
        • 데이터를 슬레이브 노드로 복제한다.
      • 슬레이브 노드
        • 마스터의 데이터를 실시간 복제하며 읽기 작업을 처리할 수 있다.
        • 장애 상황 발생 시 슬레이브 중 하나가 새로운 마스터로 승격된다.
      • Sentinel 노드
        • 마스터와 슬레이브 노드 상태를 모니터링한다.
        • 장애 발생 시 자동으로 장애 복구(Failover)를 수행한다.
        • 여러 Sentinel이 협력하여 클러스터 상태를 판단하고 복구한다.
    • 동작예시

      1. 초기상태
        • Redis 클러스터는 아래와 같은 구성을 가진다.
        • Master: redis-master
        • Slave 1: redis-slave-1
        • Slave 2: redis-slave-2
        • Sentinel: sentinel-1, sentinel-2, sentinel-3
      2. 문제 발생
        • redis-master가 다운된다.
      3. Sentinel 판단
        • sentinel-1, sentinel-2, sentinel-3이 합의(Quorum)를 통해 redis-master가 장애 상태임을 확인한다.
      4. Failover 실행
        • sentinel-1이 redis-slave-1을 새로운 마스터로 승격한다.
        • 나머지 redis-slave-2는 새로운 마스터(redis-slave-1)를 복제 대상으로 설정한다.
      5. 정상 상태 복구
        • 새로운 클러스터 상태가 된다.
        • Master: redis-slave-1
        • Slave 1: redis-slave-2
        • Down 상태였던 redis-master가 복구되면 slave로 동작한다.

Redis의 장단점

  • 장점
    • 빠른 속도 : 메모리 기반으로 매우 빠르다.
    • 유연한 데이터 구조 : 다양한 데이터 타입을 지원한다.
    • 쉬운 사용 : 간단한 명령어와 설정으로 빠르게 사용할 수 있다.
    • 커뮤니티와 확장성 : 다양한 오픈소스 확장이 존재한다.
  • 단점
    • 메모리 의존성 : 메모리에 데이터를 저장하므로 데이터 크기가 클수록 메모리 비용이 증가한다.
    • 복잡한 클러스터 설정 : 대규모 분산 환경에서 설정이 복잡할 수 있다.

RDBMS와 Redis의 차이점 비교

항목RDBMSRedis
기본 개념관계형 데이터베이스로 데이터를 테이블 형식으로 관리한다.메모리 기반 NoSQL 데이터베이스로 데이터를 키-값 형태로 관리한다.
데이터 저장 방식디스크 기반 스토리지(파일 시스템, 트랜잭션 로그)메모리 기반 스토리지 (필요 시 디스크에 백업 가능)
데이터 모델관계형 모델 (테이블, 행, 열, 스키마)비관계형 모델 (Key-Value, Hash, List, Set 등 다양한 데이터 구조)
쿼리 언어SQL (Structured Query Language)자체 명령어 기반 (SET, GET, ZADD 등)
속도디스크 기반 I/O로 인해 상대적으로 느림 (캐시를 사용하면 개선 가능)메모리 기반 처리로 매우 빠름 (읽기/쓰기 속도가 밀리초 단위로 처리됨)
트랜잭션 지원ACID(원자성, 일관성, 고립성, 지속성) 완벽 지원원자적 연산 지원 (MULTI/EXEC로 트랜잭션 유사 기능 제공), 완전한 ACID는 아님
스키마정해진 스키마 구조 필요 (스키마 변경 시 추가 작업 필요)스키마가 필요 없음 (유연한 데이터 구조 사용 가능)
데이터 구조테이블, 뷰, 인덱스 등으로 데이터 구성String, Hash, List, Set, Sorted Set, Stream 등 다양한 구조 사용 가능
확장성수직 확장(서버 성능 강화)에 유리하지만, 수평 확장(노드 추가)은 복잡한 설정 필요수평 확장에 용이 (클러스터링과 샤딩을 통해 쉽게 확장 가능)
데이터 지속성기본적으로 데이터를 디스크에 영구 저장메모리 기반이지만 RDB, AOF 방식으로 디스크에 데이터 저장 가능
주요 용도금융 시스템, ERP, CRM, 데이터 분석 등 구조화된 데이터 관리캐싱, 세션 관리, 실시간 데이터 처리, 메시지 큐, 랭킹 시스템 등 빠른 데이터 접근이 필요한 환경
사용 사례전통적인 트랜잭션 기반 시스템 (예: 은행, 전자상거래)실시간 성능이 중요한 시스템 (예: 소셜 미디어, 게임 리더보드, API 캐싱)
보안고급 보안 기능 내장 (사용자 관리, 권한 설정, 데이터 암호화)기본 보안 옵션은 단순 (requirepass 설정), 외부 접근 시 방화벽 및 TLS 설정 필요
운영 비용디스크 및 CPU 비용, 복잡한 유지보수메모리 의존도가 높아 대규모 데이터 저장 시 비용 증가 가능
복잡도정교한 데이터 모델과 쿼리 작성 가능 (복잡한 연산 처리에 적합)단순한 데이터 모델로 고속 처리에 적합 (복잡한 연산은 애플리케이션 레벨에서 처리해야 함)

참고 :
https://medium.com/@deepakchandh/different-types-of-redis-architecture-3181950b68b7
https://ankitsahay.medium.com/redis-multi-node-deployment-replication-vs-cluster-vs-sentinels-8099d15dcc09

profile
웹 개발자

0개의 댓글