[개발] Redis란, Redis의 캐싱 기능에 대해서

이수진·2023년 9월 10일
1
post-thumbnail

1. Redis란?

Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형(NoSQL) 데이터 베이스 관리 시스템(DBMS) 입니다.
(사용에 따라 데이터베이스로 사용할 수도 있고, Cache Server로 사용할 수도 있음)

데이터베이스, 캐시, 메시지 브로커로 사용되며, 인메모리 데이터 구조를 가진 저장소입니다.

특히 이 중 특히 살펴볼 부분은 "캐시"에 대한 부분입니다.
캐시는 In-memory 방식을 활용하여 데이터를 메모리 안에 두기 때문에 저장장치의 I/O보다 훨씬 더 빠르게 동작할 수 있습니다.
그래서, 자주 사용되는 데이터는 캐시 서버에서 우선 조회하고, 없을 때는 데이터베이스를 다시 조회하는 방식을 활용하면 전체적인 서비스의 속도를 향상시킬 수 있습니다.

Redis가 캐시 서버로 사용될 때에는 In-memory 기반의 데이터 처리 및 저장을 제공하여 속도가 빠르지만, 서버가 꺼지면 모든 데이터가 사라집니다.
그러므로, Redis는 전체 서비스에서 속도 향상을 위해 보조 데이터베이스로 사용하는 것이 보편적입니다.

2. In-memory 방식이란?

인메모리(In-memory)란 데이터를 컴퓨터의 주 메모리(RAM)에 저장하는 방법을 의미합니다. RAM에 데이터를 저장하게 된다면 메모리 내부에서 처리가 되므로 데이터를 저장하고 조회할 때 하드디스크를 오고 가는 과정을 거치지 않아도 됩니다.
따라서 디스크나 다른 영구적인 스토리지 장치에 데이터를 저장하는 것에 비해 훨씬 빠른 속도로 데이터에 접근할 수 있습니다.

장점

  • 빠른 데이터 접근: 디스크의 I/O에 비해 훨씬 빠른 응답 시간을 제공
  • 대량의 데이터 처리: 빠른 응답 시간으로 인해 동시에 많은 양의 데이터 처리 가능

단점

  • 비용: RAM은 디스크 스토리지에 비해 상대적으로 비싸므로, 대량의 데이터를 저장하는 데 큰 비용이 발생할 수 O
  • 데이터의 휘발성: 전원이 중단되면 RAM에 저장된 데이터가 손실됨. 따라서, 데이터의 영속성을 유지하기 위한 추가적인 방법이 필요

3. Redis 사용하는 이유

  • 데이터베이스는 데이터를 물리 디스크에 직접 쓰기 때문에 서버에 문제가 발생하여 다운되더라도 데이터가 손실되지 않음
  • 하지만 매번 디스크에 접근하기 때문에 사용자가 많아질수록 부하 증가
  • 이때 Cache Server를 도입하여 사용하고, Cache Server로 Redis를 이용할 수 있음
  • Cache Server 사용 시 같은 요청에 대해 매번 데이터베이스를 거치는 것이 아닌, Cache Server에서 첫 번째 요청 이후 저장된 결과값을 바로 반환
  • 데이터베이스 부하 감소 기능, 서비스 속도 향상

4. Redis의 특징과 장점

  • Key, Value 구조이기 때문에 쿼리를 사용할 필요가 없음
    • 고정되지 않은 스키마를 가지므로 키마다 원하는 내용만 저장 가능
  • In-Memory 데이터베이스
    • 매우 빠름
    • 서버 재시작 시 모든 데이터 유실
    • 복제 기능이 있지만 사람의 실수에는 복원 불가
    • 백업이 필요할 수 있음 (persist option 지원)
  • 다양한 자료구조를 제공
    • String, List, Hash, Set, Sorted Set, Stream 등
    • 사용 용이, 개발 편의성 증대
    • application 단에서 필요한 로직을 DB 단에서 줄일 수 있음
    • list형 데이터 입력/삭제가 MySQL에 비해 10배 빠름
  • Single Thread로 동작
    • 한 번에 여러 클라이언트의 요청을 수행할 수 없음
    • 한 클라이언트가 오래 걸리는 작업을 요청하면 장애가 발생할 수 있음
  • 여러 대의 서버 구성 가능 (Master-Slave)
  • Database, Cache, Message broker로 사용됨
    • Cache로 사용 시 무조건 TTL로 사용. 시간 중요

5. Redis와 Single Thread

일반적으로 Redis는 Single Thread를 사용한다고 알려져 있다.
이로 인해서 긴 Transaction이 들어오면 다른 요청을 처리하지 못하는 현상이 발생한다.
이런 단점에도 불구하고 Redis는 어떤 이유로 Single Thread를 사용하도록 설계되었을까?

Redis가 Single Thread여서 가지는 장점

  • 멀티 스레드를 사용하면서 발생하는 context-switch 비용을 줄일 수 있습니다
  • 스레드 간의 자원 공유로 인한 문제에서 자유롭다
    • Redis가 Single Thread로 동작하면 데이터의 동시성, 데드락 및 경쟁 조건과 같은 복잡한 동기화 문제를 피할 수 있으며, 개발자가 이러한 문제에 신경쓰지 않아도 됩니다

Single Thread임에도 High Performance를 내는 이유

  • Redis는 CPU 자원을 과도하게 사용하지 않습니다. Redis는 인메모리 데이터베이스로서, 디스크 I/O에 의존하지 않고 메모리에서 데이터를 빠르게 읽고 쓰기 때문에 CPU 부하가 상대적으로 낮습니다. 그래서 Single Thread만으로 초당 10만건 이상의 데이터 요청을 처리할 수 있습니다 (일부 명령 제외)
  • Redis는 Event-Driven 아키텍처를 사용하여 비동기 I/O를 처리합니다. 이로 인해, Redis는 I/O 작업이 블로킹되지 않도록 설계되어 있어, 네트워크 요청을 효율적으로 처리할 수 있습니다

6. Redis 장애 포인트

  • Redis가 Single Thread를 무시한 경우
    • key *, flush all 커맨드 수행 시 반환 시간동안 다른 응답 불가
    • centinel이 주기적으로 ping을 보내 장애 여부를 판단하는데 이때 장애로 판단할 수 있음
    • key * 대신 scan 0 커맨드를 사용해야 함
  • Hash나 Set에서 데이터를 많이 저장할수록 느려짐
    • 하나의 key에 너무 많은 데이터를 저장하지 않도록 한다
  • 너무 짧은 timeout 값 설정
    • 자주 갱신 되는 값이 아니라면 갱신 시간 늘리기
    • PER 알고리즘 도입

[reference]

profile
꾸준히, 열심히, 그리고 잘하자

0개의 댓글