Redis(레디스)란?
포스트
취소

Redis(레디스)란?

Redis(레디스)란?

RedisRemote Dictionary Server의 약자로,
Key-Value 구조의 비정형 데이터를 저장하고 관리하는 것에 특화된 NoSQL 데이터베이스다.

일반적인 RDBMS는 대부분 디스크(Redis)에 데이터를 저장한다.
하지만 레디스는 메모리(RAM)에 데이터를 저장한다.
디스크보다 메모리의 데이터 처리 속도가 월등히 빠르기 때문에
이를 바탕으로 레디스는 RDBMS보다 훨씬 빠른 데이터 처리 속도를 제공한다.

NoSQL?

NoSQL은 정형화된 데이터에 특화된 관계형 모델 기반인 RDBMS(Relational DataBase Management System)와 달리
비정형화된 데이터를 저장하고 조회하는데 특화된 비관계형 데이터베이스다.

기존의 RDBMS와 달리 대량의 비정형 데이터를 저장하고 조회하는데 특화되어 있다.
그래서 스키마 없이 사용하거나 스키마를 사용하더라도 느슨한 스키마를 제공한다.

문맥에 따라서 Not Only SQL 또는 Non-Relational Operational DataBase의 약자로 취급한다.

  • 장점
    • RDBMS에 비해 저렴한 비용으로 분산 처리와 병렬 처리가 가능하다.
    • 비정형 데이터 구조 설계로 설계 비용이 감소한다.
    • 빅 데이터 처리에 효과적이다.
    • 가변적인 구조로 데이터 저장이 가능하다.
    • 데이터 모델의 유연한 변화가 가능하다.
  • 단점
    • 데이터 업데이트 중 장애가 발생하면 데이터 손실이 발생할 수도 있다.
    • 인덱스 구조가 메모리에 저장되기 때문에 많은 인덱스를 사용하려면 충분한 메모리가 필요하다.
    • 데이터 일관성이 항상 보장되지 않는다.
  • 종류
    • Key-Value Database
      • 예시 : Redis, Oracle NoSQL DB 등
    • Wide-Column Database
      • 예시 : Cassandra, Google Big Table 등
    • Document Database
      • 예시 : MongoDB, Azure Cosmos DB 등
    • Graph Database
      • 예시 : Neo4j, BlazeGraph 등

Redis의 장점

  • 데이터 처리 속도
    • 데이터를 디스크에 저장하는 RDBMS와 달리 레디스는 메모리에 데이터를 저장한다.
    • 디스크보다 메모리의 데이터 처리 속도가 빠르기에 레디스의 데이터 처리 속도 또한 빠르다.
    • 초당 수십만 개의 요청을 처리할 수 있다.
    • 기본적으로 단일 스레드로 동작하기 때문에 빠른 것도 있다.
  • 다양한 데이터 구조
    • 문자열(String), 리스트(List), 세트(Set) 등 다양한 데이터 구조를 지원한다.
    • 복잡한 데이터 처리와 다양한 용도의 저장이 가능하다.
  • 간단한 설치 및 설정
    • 설치가 간편하고 설정이 단순하다.
    • 기본적인 설정만으로도 대부분의 용도에 충분히 사용할 수 있다.
  • 복제 기능
    • 레디스에는 데이터 복제 기능을 제공한다.
    • 데이터 복제 기능을 통해 주/복제 구조를 구성하기가 쉽다.
  • 고가용성 지원
    • Redis Sentinel을 사용하면 고가용성을 보장할 수 있다.
  • 스냅샷 및 AOF를 통한 지속성 보장
    • 데이터 백업 및 복구를 위한 스냅샷(Snapshot) 및 AOF를 통해 데이터의 지속성을 보장한다.
    • AOF는 모든 쓰기 명령을 로그 파일에 기록하여 장배 발생 시 데이터를 복구할 수 있게 한다.
  • 분산 시스템 지원
    • Redis Cluster를 통해 샤딩(Sharding) 및 분산 처리를 지원한다.

Redis의 단점

  • 메모리 사용량
    • 레디스는 메모리 내에서 데이터를 저장하기에 많은 양의 데이터를 저장하려면 상당한 메모리 공간이 필요하다.
    • 대규모 데이터를 처리하려면 고성능의 메모리가 필수다.
    • 메모리 용량이 부족한 경우 데이터 저장 및 처리에 문제가 발생할 수 있다.
  • 디스크 I/O 제한
    • 메모리에 데이터를 저장하기 때문에 디스크에 대한 I/O 성능이 제한적이다.
    • 대용량 데이터를 처리하거나 디스크 기반의 복잡한 쿼리를 수행할 때 성능 저하가 발생할 수 있다.
    • RDB 파일이나 AOF 파일 생성 시 I/O 성능에 영향을 끼칠 수 있다.
  • 데이터 일관성 문제
    • 레디스는 복잡한 트랜잭션 처리가 필요한 경우에는 데이터 일관성 문제가 발생할 수 있다.
      • 예시 : 스프링의 @Transactional 애노테이션션이 동작하지 않는다.
    • 애초에 레디스의 기본 트랜잭션 모델이 원자적이지 않아서 모든 상황에서 완벽한 데이터 일관성을 보장하지는 않는다.
  • 복잡한 쿼리 지원 부족
    • SQL같은 복잡한 쿼리를 지원하지 않는다.
    • SQL의 서브쿼리같은 기능들이 없기 때문에 RDBMS에 비해서 복잡한 데이터 조작이 어렵다.
  • 한계된 데이터 크기
    • 하나의 키에 저장할 수 있는 데이터 크기에는 제한이 있다.
    • 대용량 데이터를 저장하는 데 제약이 될 수 있다.
  • 보안 취약점
    • 기본적인 설정만으로는 보안성이 낮은 편이다.
    • 인증이나 암호화같은 추가 보안 설정이 필요하다.
    • 만약 보안 구성이 제대로 되있지 않다면 보안 위협에 노출될 확률이 높다.

Redis 사용 시 주의사항

  • 데이터 손실 가능성
    • 데이터를 메모리에 저장하기 때문에 서버 재시작이나 장애 발생 시 데이터가 사라질 수도 있다.
    • RDB나 AOF를 통해 데이터를 주기적으로 백업하여 데이터의 손실을 최소화해야 한다.
  • 메모리 관리
    • 데이터를 메모리에 저장하기 때문에 데이터의 총량이 많아지면 메모리가 부족해질 수 있다.
    • 주기적으로 데이터 크기와 메모리 사용량을 모니터링하며 적절한 메모리 관리를 해줘야 한다.
  • 클러스터링 및 샤딩
    • 대규모 데이터를 처리하거나 높은 가용성을 유지하려면 Redis Clustering(레디스 클러스터링)Sharding(샤딩)을 사용한다.
    • 하지만 애플리케이션에 따라 이를 설정하고 관리하는 과정이 복잡할 수도 있다.
    • 데이터 분할과 노드 간 통신에 따른 오버헤드를 고려해야 한다.
  • 보안 설정
    • 레디스는 기본적으로 인증과 암호화를 사용하지 않기 때문에 보안에 취약하다.
    • 아래와 같은 사항을 고려해보자.
      • 레디스 서버를 외부에 노출하지 말자.
      • requirepass 설정을 통해 인증을 추가하자.
      • SSL/TLS를 통해 통신을 암호화하자.
  • 데이터 일관성
    • 레디스는 단일 스레드를 통해 높은 기본 성능을 제공한다.
      • 대신에 복잡한 트랜잭션을 처리할 때 데이터 일관성 문제가 발생할 수 있다.
    • 레디스의 트랜잭션을 모든 명령어가 실행되기 전까지는 큐에 쌓이는 방식으로 동작한다.
      • 트랜잭션 중간에 문제가 발생하면 일부 명령어만 실행될 수 있다.
  • Pipelining
    • 레디스에서는 여러 명령어를 한꺼번에 보낼 수 있는 Pipelining(파이프라이닝) 기능을 제공한다.
    • 파이프라이닝 기능을 사용하면 여러 명령어를 한꺼번에 보내기 때문에 네트워크 오버헤드를 줄일 수 있다.
      • 하지만 너무 많은 명령어를 한꺼번에 보내면 메모리 사용량이 급격히 증가해서 레디스 자체 성능에 영향이 갈 수도 있다.
  • 성능 튜닝
    • 기본 설정만으로는 실제 애플리케이션에 대응하기 어려울 수도 있다.
    • 애플리케이션의 요구사항에 따라 설정 파일을 조절하여 성능을 최적화해야 한다.
    • 레디스의 모니터링 도구를 사용하여 성능을 지속적으로 관찰해야 한다.
  • 제한된 데이터 구조 크기
    • 레디스는 하나의 키에 저장할 수 있는 데이터의 최대 크기에 제한이 있다.
    • 너무 큰 데이터 구조를 사용하면 메모리 사용량이 급격히 증가햐여 레디스 자체 성능에 영향이 갈 수도 있다.
      • 데이터를 분할하거나 다른 데이터베이스를 함께 사용하는 것을 고려해야 한다.

Redis의 사용 예시

  • 캐싱
  • 실시간 분석
  • 메시지 브로커
  • 카운터
  • 랭킹
  • 데이터 스트리밍
  • 대기열
  • 인증 토큰 저장

Redis 관련 개념

Redis Sentinel (레디스 센티널)

Redis Sentinel은 장애 발생 시 운영 서비스에 영향이 없도록 도와주는 서비스다.
레디스 마스터 모니터링 및 자동 장애 극복 조치 기능을 제공한다.

스냅샷 (Snapshot)

메모리(RAM)는 휘발성이기 때문에 장애가 발생하면 데이터가 날아갈 수도 있다.
이를 위해 레디스에서는 스냅샷(Snapshot)이라는 기능을 제공한다.

스냅샷은 특정 간격으로 메모리 데이터를 덤프하여 디스크에 저장하는 파일이다.
메모리에 있는 데이터 전체를 스냅샷으로 작성하고 이를 디스크에 저장해두면
장애가 발생했을 때 데이터를 복원하려면 스냅샷 파일을 불러오면 된다.

스냅샷은 여러 개를 생성할 수 있으며,
스냅샷은 저장 시점에 메모리에 존재하는 데이터를 불러오는 것이기 때문에
스냅샷 이후에 변경된 데이터는 복구할 수 없어서
저장 시점 이후에 변경된 데이터는 사라지게 된다.

이러한 스냅샷을 통한 백업 방식을 RDB(Redis Database)라고 한다.

참고로 레디스를 종료하기 전에 자동으로 스냅샷을 저장하도록 설정되어 있으며,
기본 설정은 config get save를 실행하면 확인할 수 있다.
만약에 x y라고 되어있다면 x초 안에 y개의 데이터가 변경되면 저장된다는 의미를 갖고 있다.

AOF (Append Only File)

모든 쓰기 명령을 로그 파일에 기록하여 복구 시 모든 명령을 재싫행하여 데이터를 복구하는 방식이다.
데이터를 생성, 수정, 삭제하는 이벤트가 발생하면 초 단위로 취합하여 로그 파일에 작성한다.

모든 데이터의 변경 기록들을 보관하고 있기 때문에 최신 데이터를 유지하기에 적합한 방식이다.
그래서 RDB 방식에 데이터 유실량이 적긴하나,
RDB 방식보다 로딩 속도가 느리고 파일 크기가 크다.
게다가 RDB 방식에 비해 데이터 유실량이 적은 것이지 초 단위 데이터의 경우에는
AOF 방식도 데이터 유실의 가능성이 존재한다.

Redis 설치하기 (Windows OS 기준)

  1. 깃허브에서 msi 파일 다운로드 받기
  2. 다운로드받은 파일을 실행하기
  3. 설치할 경로 지정하기
  4. 레디스가 사용할 포트 번호 지정하기
    • 기본 포트 : 6379
  5. 레디스에 할당할 메모리 크기 지정하기
    • 기본 크기 : 100MB
  6. Install 버튼을 눌러서 설치 진행하기
  7. CMD창을 실행해서 cd [경로] 명령어를 통해 레디스를 설치한 폴더로 이동하기
    • 기본 경로로 설치 시 cd C:\Program Files\Redis 실행
  8. redis-cli 명령어 실행하기
    • 별도 설정이 없다면 정상 실행 시 프롬프트가 127.0.0.1:6379로 변경됨
  9. ping 명령어 실행하기
    • 정상 실행 시 “PONG”이라는 문자열이 출력됨

출처

비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
NoSQL이란 무엇인지 간단하게 알아보자!
[Redis] 레디스란 무엇인가? - 특징, 장단점, 사용 사례
Redis, 초면입니다. - 정의, 구조, 장단점, 활용 사례
Redis를 알아보자

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.