개발 기록

> [Redis] Redis 란? (개념, 아키텍처, 자료구조, 저장 방법) 알아보기 본문

SQL&NoSQL

> [Redis] Redis 란? (개념, 아키텍처, 자료구조, 저장 방법) 알아보기

1z 2024. 1. 6. 20:10

 

 

1. Redis 란?  (Remote Dictonary Server) 

▶ "키-값" 구조의 비정형 데이터를 저장하고 관리하기 위한 비관계형 DBMS 
▶ 모든 데이터를 메모리로 불러와서 처리하는 메모리 기반 
    : 데이터를 디스크 또는 SSD 에 저장하는 대부분의 데이터베이스와는 달리
    Redis 데이터는 서버의 주 메모리(RAM)에 저장된다.
▶ Key-Value 데이터 구조에 기반한 다양한 유형의 데이터 구조
▶ Single Thread

 

(1) 장점

☞ 메모리에 데이터를 read/write 하기 대문에 매우 빠른 속도를 보장한다.

  Redis 클러스터 기능을 제공하여 저장 공간을 확장

  단순한 캐시가 아니라 Redis는 필요한 경우 디스크에 데이터를 유지할 수 있다.

  Sharding(데이터 분산 저장), Replication(복제)이 가능하여 데이터 관리 효율이 높다.

  원격 Cache Server를 사용하기 떄문에 서버간 데이터 공유가 쉽다.

 

(2) 단점

  싱글 스레드 이므로 전체 데이터 스캔과 같은 오버헤드가 큰 명령어를 처리하는 동안 다른 명령어를 처리 불가.

  사용 가능한 메모리를 초과하여 커지면 메모리가 빠르게 부족해진다.=> 보조 데이터 저장소로 사용하는 이유

 

(3) 디스크 저장 방식 (RDB & AOF)

: 메모리에 있는 데이터를 디스크에 백업함으로써 관리하고 있는 데이터에 영속성을 제공한다. => 휘발성 보완

ex. 서버가 내려 갔을경우 디스크에 저장된 데이터를 읽어서 메모리에 다시 저장.

 

 1).  RDB (Redis DataBase) : 

: 메모리에 있는 데이터 전체에서 스냅샷을 작성하고 디스크로 저장하는 방식으로 데이터를 백업하거나 복원하기가 간단 하다. 하지만 스냅샷 이후에 변경된 데이터는 복구할 수 없다.

ex. 특정 시간마다 여러 개의 스냅샷을 생성하고, 데이터를 복원해야 한다면 스냅샷 파일을 그대로 로딩

         

 2). AOF(Append On File)  :

: 데이터를 생성/수정/삭제하는 이벤트를 초단위로 취합 및 로그 파일에 작성함으로 모든 데이터의 변경 기록들을 보관하고 있어 최신 데이터 정보 백업이 가능하다. 하지만 RDB  방식보다 로딩 속도가 느리고  파일 크기가 큰 것이 단점이다. 

     3). 디스크 저장 방식 선택기준

    일부 데이터 손실에 영향을 받지 않는 경우(캐시로만 사용할 때), RDB

    장애 상황 직전까지의 모든 데이터가 보장되어야 할 경우, AOF

    강력한 내구성이 필요한 경우, RDB + AOF

    레디스는 일반적으로 AOF와 RDB를 동시에 사용하여 데이터를 백업한다.

    ex. 매일 7시마다 RDB 스냅샷을 생성하고, RDB 생성 이후에 변경되는 데이터는 AOF로 백업.

     

    (4) Redis 자료구조

     

    기본적으로 키-밸류(Key-Value) 형태의 구조를 띠며, 밸류가 사용하는 자료 구조에 따라 여러 기능을 사용할 수 있다. 즉, 어떤 형태의 자료 구조를 사용하더라도 키는 반드시 필요하다.

     

    String   
    Bits  * 데이터 저장공간 절약, 정수로 된 데이터만 카운팅 가능
    사용 ex.
    - 유저아이디가 정수일 경우. 오늘 서비스 접속 유저 수를 저장하고 싶을 때 비트연산자 사용!
    - 날짜를 키값으로 두고 유저아이디에 해당하는 비트자리를 1로 설정 (1명=1비트, 천만 명=천 만자리 수 비트)
    Bitmap  비트 연산을 사용할 수 있는 자료 구조
    List (Linked List) 형태로 서로 연결되어 있다
    Hashe  해시 자료 구조. 해시 필드(field)와 밸류(value)로 구성된다.
    해시 데이터는 레디스 키와 매핑되어 있으므로 해시 밸류를 생성 및 조회 하려면 레디스 키와 필드를 동시에 사용해야 한다.
    Set 리스트와 비슷한 집합 데이터, 중복을 허용하지 않는 자료 구조이다.
    Sorted Set
    (ZSet) 
    Set과 비슷한 집합 데이터, 이름과 값, 필드를 사용할 수 있는 자료 구조 형태이다.
    요소가 목록에 유지되고 점수에 따라 정렬된다. 값이 중복되면 사전 순으로 정렬한다.
    중복을 허용하지 않으며, 이 때 데이터는 스코어와 함께 저장할 수 있다.

    Hypperloglog  집합의 데이터 개수를 추정할 수 있는 알고리즘 이름이자 이를 사용할 수 있는 레디스 자료 구조이다
    이 알고리즘은 비트 패턴을 분석하여 비교적 정확한 추정 값(오차 0.81%)을 계산할 수 있다.
    Stream     

     

     

    (5) Redis 사용 용도 (데이터베이스, 캐시, 스트리밍 엔진, 메시지 브로커 )

    1. 캐싱 
    2. 세션관리 : 세션키에 대한 적절한 TTL 과 빠른 Key-value 저장소를 사용
    3. 실시간 순위표 : ZSet(Sorted Set) 자료 구조를 이용하여 순위 계산 용도로 사용하기도 한다.              
      ex. 게임 랭킹, 좋아요를 가장 많이 받은 메시지 등
    4. 속도 제한 : 이벤트 속도를 측정하고 필요한 경우 제한 할 수 있다.
      ex. 포럼의 게시물 수를 제한, 리소스 사용량을 제한, 스팸을 억제
    5. 대기열 : Redis List 데이터 구조 사용
    6. 채팅 및 메시징 : pub/sub을 사용

     

     

     


     

    2. Redis 사용 방법   

     

    (1) RedisTemplate 클래스를 사용

     RedisRepository 는 객체를 담아서 저장했다면, RedisTemplate는 특정 자료구조에 값을 저장하는 방식이다. -> 특정 Entity 뿐 아니라 개발자가 원하는 여러가지 데이터 타입을 넣을 수 있다.

    (2) CrudRepository를 상속받는 RedisRepository를 사용

     - JPA 와 같이 사용할 수 있었다. 

     - 트랜잭션을 지원하지 않는다.

     - 객체를 담아서 저장한다.

     

     


     

    3. Redis 아키텍처  

     

    (1) Standalone : Replication 아키텍처 :

    Master와 Replica로 구성, 단순한 복제 연결 시 사용한다. 복제가 잘 됬는지 확인하지 않는 비동기식 복제, HA(고가용성) 기능이 없으므로 장애 상황 시 수동으로 복구한다

     

    (2) Sentinel :

    Sentinel, Master, Replica로 구성 되어 있으며, Sentinel 노드가 Master 와 Replica 노드를 감시한다.  Master가 비정상 상태일 때 자동으로 Failover(자동 복구)가 가능한 HA(High Availability) 구성

     

    (3) Cluster :

    레디스 3.0 버전 이후부터 제공, 클러스터에 포함된 노드들이 서로 통신하는 구조, 클러스터 내부의 모든 노드는 모두 서로 연결되어 있는 메시(Mesh) 구조로 되어 있으며, 가십 프로토콜(gossip protocol)을 사용하여 서로 모니터링 한다. 또한 데이터를 마스터 노드들에 샤딩한다.

     

     

     

    4. Redis Client  

     

    (1)   Lettuce

    - Multi-Thread 에서 Thread-Safe한 Redis 클라이언트로 netty에 의해 관리된다.
    - Sentinel, Cluster, Redis data model 같은 고급 기능들을 지원
    - 비동기 방식으로 요청하기에 TPS/CPU/Connection 개수와 응답속도 등 전 분야에서 Jedis 보다 뛰어나다.
    - 스프링 부트의 기본 의존성은 현재 Lettuce로 되어있다.

    (2)  Jedis  :

    Multi-Thread 에서 Thread-unsafe 하며 Connection pool을 이용해 멀티쓰레드 환경을 구성한다.
    Jedis 인스턴스와 연결할 때마다 Connection pool을 불러오고 스레드 갯수가 늘어난다면 시간이 상당히 소요될 수 있다.
       

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    참고

    https://www.youtube.com/watch?v=92NizoBL4uA

    https://www.essential2189.dev/what-is-redis#f78717d7-5076-4d44-b785-6235b52ff726

    https://velog.io/@banggeunho/%EB%A0%88%EB%94%94%EC%8A%A4Redis-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90.-%EC%A0%95%EC%9D%98-%EC%A0%80%EC%9E%A5%EB%B0%A9%EC%8B%9D-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%9C%A0%ED%9A%A8-%EA%B8%B0%EA%B0%84

    https://arahansa.github.io/docs_spring/redis.html#redis:sentinel