Redis 가 무엇일까? Redis 설명글

2024. 10. 4. 11:09·Programming/BackEnd
반응형

Redis 아이콘

 

[Redis 가 무엇인가요?]

- Redis 에 대해 설명하기 전에 먼저 기술에 대한 필요성에 대해 설명드리겠습니다.

 

서비스 개발을 할 때, 데이터를 가져오는 위치를 데이터 소스(Data Source) 라고 하겠습니다.

데이터 소스를 컴퓨터 구조적으로 분류하자면 메모리와 저장장치, 입력장치라고 분류가 가능하며,

개발 관점에서 보자면, 메모리, 데이터베이스, 파일, 네트워크, 그외 입출력 라이브러리 라고 분류할 수 있습니다.

 

Redis 는 현재 기준 최근에 만들어진 "그외 입출력 라이브러리" 로 묶을 수 있습니다.

 

그런데 왜 전통적인 데이터소스 외의 별도의 데이터소스가 필요하게 된 것일까요?

 

Redis 의 본질은 메모리 저장 및 출력 시스템입니다.

컴퓨터 메모리 상에 데이터를 저장했다가 읽어오는 기능의 중간자 역할을 담당하죠.

 

그런데, 메모리에 대한 사용은 일반적인 프로그래밍 언어에서는 기본적인 기능입니다.

그렇다면 굳이 프로세스 상에서 데이터를 할당하고 사용하는 것 이상의 기능을 Redis 가 제공해야 할 것입니다.

 

(Redis 의 기능 설명)

1. 네트워크 요청을 통한 데이터 공유 가능

Redis 의 핵심 기능입니다.

프로그램 상으로 할당되는 데이터는 해당 프로세스가 실행되는 컴퓨터 디바이스와 연결된 메모리 뿐입니다.

우리가 데이터베이스를 기반으로 MSA 를 구축할 수 있는 것은 데이터베이스는 어느 위치에서 프로세스가 실행되든 네트워크로 연결되어 사용이 가능하기 때문입니다.

즉, 물리적으로 떨어진 위치의 프로세스간 데이터베이스로 정보를 공유할 수 있는 것이죠.

메모리의 경우에도 동일한 기능과 구조를 원할 수 있습니다.

Redis 사용 아키텍쳐

 

예를들어 백엔드 서버를 ScaleOut 으로 성능을 높이려고 할 때, 백엔드 서버를 복제해서 띄운 순간, 기존 백엔드 서버 프로세스 내에서 메모리상에 중요한 정보가 저장되어 사용중이라고 합시다.

새로 만들어진 서버는 해당 메모리의 정보를 모르는 상태로 메모리가 초기화되어 실행되기에 두 서비스간 싱크가 맞지 않고 오동작할 가능성이 있습니다.

이때, 서버가 프로세스 자체적으로 메모리를 사용하지 않고 위와 같이 Redis 를 이용하여 네트워크상으로 접근해 사용한다면, 새로 만들어진 여러 프로세스들은 공통된 메모리를 사용하며, 메모리인 만큼 데이터베이스보다 빠른 접근으로 데이터를 사용 가능해집니다.

 

즉, 데이터베이스가 프로세스의 저장장치 사용에 대한 결합성을 느슨하게 만들었듯이 Redis 가 프로세스의 메모리 사용에 대한 결합성을 느슨하게 만든 것과 마찬가지입니다.

 

현 시대의 소프트웨어 개발의 화두는 이와 같이 느슨한 결합을 통한 MSA 의 구현이라고 할 수 있으며, 이에 따른 기술 개발의 결실이 Redis 라고 할 수 있겠습니다.

 

- 데이터 만료시간 설정 기능

핵심 기능은 위와 같은데, 메모리 사용의 근본적인 문제에 대해 짚고 넘어가겠습니다.

메모리는 비싼 저장 장치입니다.

몇 TB 나 하는 비휘발성 데이터 저장장치에 비해 메모리는 항상 작은 용량입니다.

만약 메모리 저장소를 데이터베이스처럼 사용한다면 메모리 안에 데이터가 쌓이다가 넘치게 되겠죠?

개발에 있어서 메모리는 잠시 데이터가 스쳐가는 통로 역할을 하며, 이 공간을 점유하는 방식으로 개발하는 것은 지양되며, 본의 아니게 메모리에 데이터가 쌓이는 방식으로 알고리즘이 작성되었다면 메모리 릭(Leak)이라고 부르며 에러로 다루어질 정도로 경계됩니다.

고로 메모리 저장소인 Redis 역시 이에대한 안전책을 내놓아야 하며,

그 결과 데이터별 만료시간을 설정할 수 있는 기능을 갖추어야 했습니다.

Redis 안에 Key 와 Value 형태로 저장되는 모든 데이터에는 만료시간의 설정이 가능하며, 이 만료시간이 지나면 자동으로 메모리상에서 데이터가 사라지도록 하는 기능이 제공됩니다.

 

- 싱글 스레드 이벤트 루프 처리

Redis 는 들어오는 모든 요청을 이벤트 루프의 이벤트 큐 안에 적재하고, 싱글스레드로 하나씩 처리하는 방식으로 작업을 처리합니다.

이로인해 Context 스위칭을 통한 비효율을 줄이며, 비동기 처리로 인한 시스템 복잡도 상승을 방지하며, 데이터 싱크 문제 역시 없습니다.

 

- 데이터 백업 기능

Redis 는 휘발성 메모리상에 저장되지만 엄연히 데이터베이스라 할 수 있습니다.

단순히 메모리상으로만 저장된다면 사고 등의 이유로 Redis 가 실행되는 디바이스가 꺼졌다가 다시 켜진다면 기존 데이터가 전부 날아가버리는데, 이러한 사고를 방지하기 위한 Redis 영속성 보장 기능이 있습니다.

컴퓨터 공학상 데이터를 보존하려면 비휘발성 저장장치를 사용해야만 합니다.

Redis 에서는 데이터 보존을 위해 파일로 기존 데이터를 저장하는 방식을 사용하며,

방식은 두가지가 있습니다.

 

RDB : 스냅샷 방식으로, 일정 시간마다 한번씩 메모리에 있는 모든 데이터를 전부 파일로 저장하는 방식입니다.

앞서 Redis 가 싱글 스레드라고 했는데, 스냅샷을 하는 시간동안은 어떠한 작업도 수행할 수 없게 되며,

스냅샷 이후, 다음 스냅샷이 있기 전까지의 데이터는 유실에 취약합니다.

 

AOF : Redis 의 Write / Update 명령마다 로그를 남기는 방식으로 데이터를 백업합니다.

데이터 변조 명령마다의 처리 속도가 느려지지만 모든 데이터에 안정적인 백업을 제공합니다.

 

- 클러스터링 기능

Redis 는 여러 위치에서 접근이 가능한 메모리입니다.

당연히 여러 위치에서 사용한다면 메모리 사용량도 늘어날 것입니다.

또한, 네트워크 장애, Redis 노드 종료 등의 이유로 연결이 끊어질 위험도 있습니다.

이러한 단점을 극복하고, 서비스 프로세스가 신뢰하며 사용할 수 있도록 하는 기능이 필요할 것입니다.

이때 사용되는 기술이 Redis 클러스터입니다.

https://velog.io/@ekxk1234/Redis-Cluster

 

먼저 Redis 클러스터의 샤딩(데이터 분산 저장 및 조회) 기능으로 Redis 를 횡적으로 늘릴수록 메모리 저장 공간이 늘어나는 효과를 볼 수 있습니다.

또한, Master - Replica 구조로 인해 마스터 노드에서 입력받은 데이터를 Replica 가 백업하여 갖고 있으므로 데이터 유실의 위험도 줄어들고, 각 노드들이 서로 통신을 하고 있다가, 특정 노드가 종료되면 다른 노드가 자동으로 그 역할을 이어받는 리밸런싱과 기능을 통해 고가용성을 유지할 수 있습니다.

 

- Key-Value 데이터 저장 기능

Redis 는 데이터를 저장할 때, Key-Value 구조를 사용합니다.

이로인해 SQL 같은 고난이도 사용 방식을 익혀야하는 RDBMS 와 같은 시스템과 달리 NoSQL 로 데이터를 쉽게 저장하고 쉽게 조회가 가능하며,

이러한 단순한 구조로 인해 싱글 스레드로 사용하기에도 성능이 좋습니다.

 

(Redis 의 정의)

- 위와 같은 설명으로 Redis 가 왜 필요한지에 대해 알아보았습니다.

Redis 에 대한 정의는,

"Key - Value 형식의 인메모리 데이터베이스"

라고 정리하는 것으로 이번 포스팅을 마치도록 하겠습니다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'Programming > BackEnd' 카테고리의 다른 글

Springboot MongoDB 설정하기 (멀티 소스 데이터베이스 접속, MongoDB ReplicaSet 접속 및 트랜젝션 Annotation 작성)  (0) 2024.10.08
Springboot JPA 설정하기 (멀티 소스 데이터베이스 접속 및 트랜젝션 Annotation 작성)  (2) 2024.10.08
Springboot Kafka Cluster(SASL) 설정 및 사용 방법 (@Configuration 클래스 사용)  (1) 2024.10.02
Springboot Redis Cluster 설정 및 사용 방법 (@Configuration 클래스 사용)  (1) 2024.09.30
Springboot Kafka Cluster 설정 및 사용 방법 (@Configuration 클래스 사용)  (1) 2024.09.30
'Programming/BackEnd' 카테고리의 다른 글
  • Springboot MongoDB 설정하기 (멀티 소스 데이터베이스 접속, MongoDB ReplicaSet 접속 및 트랜젝션 Annotation 작성)
  • Springboot JPA 설정하기 (멀티 소스 데이터베이스 접속 및 트랜젝션 Annotation 작성)
  • Springboot Kafka Cluster(SASL) 설정 및 사용 방법 (@Configuration 클래스 사용)
  • Springboot Redis Cluster 설정 및 사용 방법 (@Configuration 클래스 사용)
Railly Linker
Railly Linker
IT 지식 정리 및 공유 블로그
  • Railly Linker
    Railly`s IT 정리노트
    Railly Linker
  • 전체
    오늘
    어제
  • 공지사항

    • 분류 전체보기 (169) N
      • Programming (74) N
        • BackEnd (36)
        • FrontEnd (12) N
        • DBMS (3)
        • ETC (23)
      • Study (88)
        • Computer Science (21)
        • Data Science (24)
        • Computer Vision (22)
        • Computer Graphics (1)
        • NLP (15)
        • ETC (4)
      • Error Note (6)
      • ETC (1)
  • 인기 글

  • 최근 글

  • 최근 댓글

  • 태그

    데이터베이스 제약
    Kotlin
    unique
    MacOS
    docker 배포
    list
    논리적 삭제
    kotlin mutablelist
    지리 정보
    localhost
    network_mode: "host"
    jvm 메모리 누수
    springboot 배포
    kotlin linkedlist
    kotlin arraylist
    단축키
    docker compose
  • 링크

    • RaillyLinker Github
  • hELLO· Designed By정상우.v4.10.0
Railly Linker
Redis 가 무엇일까? Redis 설명글
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.