Backend/Database

Redis란?

_은선_ 2024. 8. 19. 00:52
728x90
SMALL

Redis란?

Redis는 key-value 구조의 비정형 데이터를 저장하고 관리하기 위한 (오픈소스) 인메모리 데이터 저장소이다.

NoSQL DBMS로 분류되며 동시에 Memcached와 같은 인메모리 솔루션으로 분류할 수 있다.

  • DB, Cache, Message Queue, Shared Memory 용도로 사용된다.
인메모리
컴퓨터 주기억장치인 RAM에 데이터를 올려서 사용하는 방법을 의미한다. RAM에 데이터를 저장하게 되면 메모리 내부에서 처리가 되므로 데이터를 저장하고 조회할 때 디스크를 오고가는 과정을 거치지 않아도 되어 속도가 빠르다. 따라서, SDD, HDD 같은 저장공간에서 데이터를 가져오는 것보다 RAM에서 데이터를 가져오는 속도가 수백배 이상 빠르다.

 

장점

  1. 인메모리 저장소이기 때문에 데이터 엑세스 속도가 매우 빠르다.
    • 전통적인 디스크 기반 데이터베이스에 비해 메모리에서 직접 데이터를 읽고 쓰는 속도가 훨씬 빠르다.
    • 외부 저장 장치(디스크)를 사용했다면 메모리와 외부 저장 장치와의 병목 현상이 발생했겠지만, 메모리만 사용하기 때문에 데이터 저장 속도가 매우 빠르다.

    메모리 외부 저장 장치
    RAM HDD, SDD
    CPU에서 이루어진 연산을 기록하는 메모리로,
    CPU와 HDD를 연결시켜주는 장치
    컴퓨터의 정보, 문서, 자료 등을 저장하고 읽을 수 있는 장치
  2. 다양한 데이터 구조를 지원한다.

 

  • 예를 들면, 실시간 랭킹 구현 시에는 Sorted Set 자료구조를 이용하면 쉽고 빠르게 구현할 수 있다.
  • 다양한 데이터 구조 설명 
    • Strings : 가장 일반적인 key-value 구조의 형태
    • Sets : String의 집합으로, 여러 개의 값을 하나의 value에 넣을 수 있다.
      • 포스트의 태깅
    •  Sorted Sets : 중복된 데이터를 담지 않는 Set 구조에 정렬을 적용한 구조
      • 랭킹 보드 서버
    •  Array 형식의 데이터 구조

단점

  1. Redis는 인메모리 방식으로 동작하기 때문에 서버의 메모리 용량을 초과하는 데이터를 처리할 경우, RAM의 특성인 휘발성에 따라 데이터가 유실될 수 있다.
휘발성
전원이 꺼지면 가지고 있던 데이터가 사라지는 특성

DBMS와 함께 Redis를 사용하는 이유

DBMS는 디스크 접근 속도 때문에 사용자가 많아지면 성능 저하가 발생할 수 있다. 따라서, Redis와 같은 캐시 서버를 도입하면, 동일한 요청이 여러번 들어올 때 DB에 매번 접근하지 않고, Redis에서 미리 저장된 데이터를 빠르게 가져와 DB 부하를 줄이고, 서비스 성능을 향상시킬 수 있다.


Redis의 특징

  1. 인메모리 기반 key-value 데이터 관리 시스템
    • NoSQL DBMS(비관계형 데이터베이스)로 분류되며, 인메모리 기반의 key-value 구조를 가진 데이터 관리 시스템이다.
  2. 다양한 데이터 구조 지원
  3. 인메모리 데이터 저장소
    • 메모리 기반이라 모든 데이터들을 메모리에 저장하고, 조회 시에 매우 빠르다.
  4. Remote Data Storage를 통한 데이터 공유
    • Remote Data Storatge로 여러 서버에서 같은 데이터를 공유하여 보고 싶을 때 사용할 수 있다.
  5. 데이터의 영구성
    • 메모리 기반이지만, Redis는 영속적인 데이터 보존이 가능하다. (메모리는 원래 휘발성)
  6.  원자적 명령어
    • Redis의 모든 명령어는 원자적으로 실행되며, 이는 동시 접근 시에도 데이터 일관성을 보장한다. 또한 트랜잭션을 지원하여 여러 명령어를 원자적으로 처리할 수 있다.
  7.  Pub/Sub 기능
    • Redis는 publish/subscribe 메시징 패턴을 지원하여 실시간 메시징 시스템으로 활용될 수 있다.
      • 채팅, 알림 시스템, 실시간 피드 등에서 활용할 수 있다.
  8.  복제 및 고가용성
    • Redis는 마스터-슬레이브 복제(Replication)을 지원하여 데이터의 고가용성을 보장한다.
      • 마스터 인스턴스에서 데이터를 처리하고, 슬레이브 인스턴스들이 이를 복제하여 백업 및 읽기 성능을 높일 수 있다.
      • Redis Sentinel을 사용하면 장애가 발생했을 때 자동으로 장애 조치를 수행하여 마스터/슬레이브를 자동으로 전환할 수 있다.
    • Replication을 지원하여 데이터 복제를 쉽게 설정할 수 있다.
  9. 스크립팅 기능
    • Lua script를 지원하여, 여러 명령어를 스크립트로 작성해 서버에서 실행할 수 있다. 이를 통해 복잡한 연산을 서버에서 처리할 수 있어 성능 최적화가 가능하다.
  10. 싱글 스레드로 작동
    • Redis는 싱글 스레드로 작동하여 한 번에 하나의 명령만 수행할 수 있다.
  11. 클라이언트 측 샤딩을 통한 쓰기 성능 증대
    • 쓰기 성능 증대를 위한 클라이언트 측 샤딩을 지원한다.
샤딩(Sharding)
같은 테이블 스키마를 가진 데이터(row)를 다수의 데이터베이스에 분산하여 저장하는 방법

파티셔닝 
한 데이터베이스 내에서 테이블을 나누는 방식이다. 테이블을 물리적으로 여러 개의 파티션으로 나누어, 각 파티션이 특정 데이터 범위를 저장하게 된다.

Redis의 영속성 지원 방법

Redis는 인메모리 저장소이기 때문에 메모리에서 데이터가 관리된다.

따라서, 서버가 종료되면 Redis에 저장된 데이터가 모두 휘발된다.

이러한 데이터 휘발 문제를 해결하기 위해 Redis는 메모리에 저장되어 있는 데이터를 디스크로 백업하는 영속성 기능을 지원한다.

  • RDB 방식 (스냅샷 방식) : 설정한 주기마다 해당 시점의 데이터 스냅샷을 파일로 디스크에 저장하는 방식
  • AOF 방식 (Append on File 방식) : Redis의 모든 write 연산을 log파일에 기록한 후, 서버가 재실행될 때 해당 log에 기록된 write 연산을 재실행하는 형태로 데이터를 복구하는 방식

Redis 활용 사례

  • 캐싱 서버
    • 메시지를 주고 받아야할 때, 장바구니의 삭제
  • 잡큐(list)
  • 유저 API Limit
  • 인증 토큰 등을 저장
    • Redis의 Strings or Hash 사용
  • 실시간 랭킹
    • Redis의 Sorted Set 데이터 구조를 사용하면 데이터를 쉽고 빠르게 가져올 수 있다.
  • 채팅 및 메시징
    • Redis의 Pub/Sub을 사용해서 구현할 수 있다.

주의할점

1. 메모리 단편화(파편화)가 발생할 수 있다.

    • RAM에서 메모리를 할당하고 해제하는 과정에서 작은 빈 공간이 발생할 수 있다. 이로 인해 새로운 메모리를 할당할 때, 사용 가능한 메모리의 총량은 충분하지만, 할당하려는 크기에 맞는 연속된 공간이 부족하게 된다. 결국 메모리는 조각화되어 비효율적으로 사용되고, 이로 인해 새로운 메모리는 주로 메모리의 끝부분에 할당되면서 메모리 낭비가 심해진다.
    • 이러한 메모리 단편화가 계속되면, 사용 가능한 실제 물리적 메모리가 충분함에도 불구하고, 메모리가 효율적으로 활용되지 못해 Redis 프로세스가 메모리 부족(OOM)으로 인해 종료될 수 있다. 이를 방지하기 위해 Redis 사용 시에는 메모리 할당량을 적절히 여유 있게 설정하고, 메모리 단편화를 최소화할 수 있는 방법(예: jemalloc 설정 및 모니터링)을 고려해야 한다.메모리 단편화(파편화)가 발생할 수 있다.

 

2. 서버에 장애가 발생할 경우, 그에 대한 운영 플랜이 필요하다.

  • 인메모리 저장소의 특성상, 서버에 장애가 발생했을 경우 데이터 유실이 발생할 수 있기 때문이다.

3. 메모리 관리가 필요하다.

  • 메모리 사용량이 너무 많으면 서버의 성능 저하나 장애로 이어질 수 있기 때문에 주기적인 모니터링을 통해 메모리 관리가 필요하다.

4. 싱글 스레드의 특성상, 한 번에 하나의 명령만 처리할 수 있어, 처리 시간이 긴 요청이 들어오면 시스템 장애가 발생할 수 있다.

  • 전체 데이터를 다루는 시간 복잡도를 가진 O(N) 명령어 keys flush getall 는 주의해서 사용할 필요가 있다.
대표적인 O(N) 명령 및 사례
KEYS, FLUSHALL, FLUSHDB, Delete COlLECTIONS, Get All Collections
모니터링 스크립트가 일초에 한번씩 keys 호출
큰 컬렉션의 데이터를 모두 가져오는 경우
Access Token 저장을 List(O(N)) 자료 구조를 통해 이루어진다. → 삭제 시에 모든 item을 찾아봐야함,
최근에는 Set을 통해 가져오도록 패치됨
keys는 scan 명령어로 사용하는 것으로 하나의 긴 명령을 짧은 여러 명령으로 변경 가능

 


참고문헌

https://inpa.tistory.com/entry/REDIS-📚-개념-소개-사용처-캐시-세션-한눈에-쏙-정리?category=918728#redis-활용하기---캐시cache

 

[REDIS] 📚 레디스 소개 & 사용처 (캐시 / 세션) - 한눈에 쏙 정리

Redis (Remote Dictionary Server) Redis는 Remote(원격)에 위치하고 프로세스로 존재하는 In-Memory 기반의 Dictionary(key-value) 구조 데이터 관리 Server 시스템이다. 여기서 key-value 구조 데이터란, mysql 같은 관계형

inpa.tistory.com

 

 

https://inpa.tistory.com/entry/REDIS-📚-캐시Cache-설계-전략-지침-총정리

 

[REDIS] 📚 캐시(Cache) 설계 전략 지침 💯 총정리

Redis - 캐시(Cache) 전략 캐싱 전략은 웹 서비스 환경에서 시스템 성능 향상을 기대할 수 있는 중요한 기술이다. 일반적으로 캐시(cache)는 메모리(RAM)를 사용하기 때문에 데이터베이스 보다 훨씬 빠

inpa.tistory.com

 

https://velog.io/@hope1213/Redis란-무엇일까

 

Redis란 무엇일까..?

최근 여러 프로젝트를 찾아보며 구경하다보니 redis의 존재에 대해 알게됐습니다. 검색을 해보니 캐시와 비슷한 것??? 이라고하는데 솔직히 잘 모르겠어서 이 redis를 캐시대신 사용하는 이유가 무

velog.io

 

https://ksh-coding.tistory.com/127

 

[DB] Redis란?

여러 프로젝트를 살펴보니, 인메모리 저장소로 Redis를 사용하는 것을 많이 볼 수 있었습니다.Redis가 무엇이고, 어떤 장점이 있길래 많이 사용하는 걸까요?프로젝트에 적용하기 전에 간략하게 Redi

ksh-coding.tistory.com

 

https://techietalks.tistory.com/entry/Redis-Redis란

 

[Redis] Redis란?

Redis란?레디스는 고성능 인메모리 데이터 구조 저장소입니다. Remote Dictionary Server의 약어이며, C언어로 만들어졌습니다. 메모리를 사용하기 때문에 매우 빠릅니다.이전에 유사한 인메모리 데이터

techietalks.tistory.com

 

https://wildeveloperetrain.tistory.com/21

 

Redis란? 레디스의 기본적인 개념 (인메모리 데이터 구조 저장소)

Redis란? Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템 (DBMS)입니다. 데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리

wildeveloperetrain.tistory.com

 

https://velog.io/@wnguswn7/Redis란-무엇일까-Redis의-특징과-사용-시-주의점

 

Redis란 무엇일까? - Redis의 특징과 사용 시 주의점

웹, 인공지능, 빅데이터 등이 생겨나고 데이터 정보의 크기가 커지면서 DB의 한계가 생기는데,이는 SSD로 많이 개선되었지만 여전히 디스크에 데이터를 저장해야하므로 이 또한 한계에 다다르게

velog.io

 

https://steady-coding.tistory.com/586

 

[데이터베이스] Redis란?

cs-study에서 스터디를 진행하고 있습니다. Cache Cache의 개념 Cache란 나중에 요청할 결과를 미리 저장해둔 후 빠르게 서비스해 주는 것을 의미한다. 즉, 미리 결과를 저장하고 나중에 요청이 오면 그

steady-coding.tistory.com

 

728x90
LIST