Redis 개요

개요

레디스는 Remote Dictionary Server의 약자로서, “키-값” 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템이다. 2009년 살바토르 산필리포가 처음 개발했다. 2015년부터 Redis Labs가 지원하고 있다. 다양한 서비스에서 레디스를 자유롭게 사용되고 있다.

Pareto principle(파레토의 법칙)

우리 사회에서 일어나는 현상의 80%는 20%의 원인으로 인해 발생됨을 뜻하는 법칙이다. 웹 사이트에 대한 접근도 파레토의 법칙이 딱 들어맞아,

인터넷 통신의 80%가 불과 20%의 사이트에 대한 액세스로 추정되며, 이 20%의 웹사이트 데이터를 캐시해두면 효율을 극적으로 향상할 수 있다

고 한다.

(인프라 엔지니어의 교과서 - 네트워크편, 2017, 길벗)

따라서 공통으로 사용되는 데이터는 레디스를 이용하여 캐시로 저장해 두는 것이 리소스를 효율적으로 이용할 수 있는 방법이 될 수 있을 것이다.

Redis 특징

  • Redis는 key-value store NoSQL DB이다.
    • 단순 string에 대한 key-value 구조를 지원
    • 바이너리 데이터 쓰기
  • Single Thread로 동작한다.
    • 싱글 스레드로 동작하여 연산의 원자성을 보장한다.
  • 다양한 자료 구조를 지원한다.
    • collection 지원 : List, Set, Sorted Set, Hash 등의 자료 구조 지원
  • 빠른 속도
    • 초당 100,000 QPS 수준의 성능을 자랑한다.
  • Disk 저장
    • Disk에 영구적으로 저장 가능하다.
  • 복제(replication)
    • 다른 노드에서 해당 내용을 복제할 수 있는 마스터/슬레이브 구조를 지원한다.
  • Sharding 지원
    • Redis Cluster를 통해 데이터 sharding 지원한다.
  • Publish/Subscribe 지원
    • 메세지 브로커로 사용 가능
  • Expire (만료 시간)
    • key에 expire를 설정하여, 시간이 오래 지난 데이터는 자동 삭제할 수 있다.
  • 데이터의 스냅샵 혹은 AOF 로그를 통해 복구가 가능해서 어느정도는 영속성도 보장된다.
  • Java Spring에서는 세션 관리 및 캐싱을 하는데 자주 사용된다.

왜 Collection이 중요한가요?

레디스는 In-Memory 데이터베이스이다. 즉, 모든 데이터를 메모리에 저장하고 조회한다. 기존 관계형 데이터베이스(Oracle, MySQL) 보다 훨씬 빠른데 그 이유는 메모리 접근이 디스크 접근보다 빠르기 때문이다. 하지만 빠르다는 것은 레디스의 여러 특징 중 일부분이다. 다른 In-Memory 데이터베이스(ex. Memcached) 와의 가장 큰 차이점은 다양한 자료구조 를 지원한다는 것이다. 레디스는 아래처럼 다양한 자료구조를 Key-Value 형태로 저장한다.

레디스는 기본적으로 String, Bitmap, Hash, List, Set, Sorted Set 를 제공했고, 버전이 올라가면서 현재는 Geospatial Index, Hyperloglog, Stream 등의 자료형도 지원하고 있다.

그렇다면 이렇게 다양한 자료구조를 제공하는게 왜 중요할까요? 바로 개발의 편의성과 난이도 때문이다.

예를 들어, 실시간 랭킹 서버를 구현할 때 관계형 DBMS를 이용한다면 DB에 데이터를 저장하고, 저장된 SCORE 값으로 정렬하여 다시 읽어오는 과정이 필요할 것이다. 개수가 많아지면 속도가 느려지게 마련인데, 이 과정에서 디스크를 사용하기 때문이다. In-memory 기반으로 서버에서 데이터를 처리하도록 직접 코드를 짤 수도 있겠지만, 레디스의 Sorted-Set을 이용하는게 더 빠르고 간단한 방법일 것이다.

Redis Persistence

Redis는 디스크에 데이터를 저장하는 방법으로 RDB(Snapshot)과 AOF(Append Only File) 방식을 사용한다.
두 방식 모두 내부적으로 fork() 함수를 사용하므로, 충분한 메모리가 필요하다.

  • RDB(Snapshot)

    • 메모리에 있는 데이터들을 디스크에 옮겨 담는 방식이다.
    • 스냅샷 방식은 메모리의 상태를 그대로 뜬 것이기 때문에 특정 시점의 백업 및 복구에 유리하고, AOF 방식에 비해 더 빠르게 데이터를 메모리에 올릴 수 있다.
    • 서버가 다운되면 백업된 스냅샷 사이에 변경된 데이터들은 유실된다.
    • 두 가지 방식이 있다.
      • SAVE : blocking 방식으로 순차적으로 모든 Redis의 동작을 정지시키고, 그 때의 Snapshot을 Disk에 저장한다.
      • BGSAVE : non-blocking 방식으로 별도의 process를 통해서 수행 당시의 메모리 snapshot을 디스크에 저장한다.
  • AOF(Append Only File)

    • Redis의 모든 write/update 연산을 log 파일의 형태로 기록하는 방법이다.
    • 서버가 실행되면 순차적으로 연산을 재실행하여 데이터를 복구한다.
    • 연산 작업이 실행될 때마다 기록하기 떄문에 현재 시점까지의 로그를 남길 수 있다.
    • 로그 파일에 대해서 append만 수행하기 때문에 write 속도가 빠르고, 서버가 다운되도 데이터 유실이 발생하지 않는다.
    • 모든 연산에 대해서 로그를 남기기 때문에 데이터의 양이 매우 크다.
    • 서버를 재시작 시, 모든 연산을 다시 수행하기 떄문에 restart 속도가 느리다.

Redis를 클라우드에서 사용

애플리케이션 개발에 Amazon의 Amazon Web Services 및 Microsoft의 Microsoft Azure를 사용하는 경우 각 클라우드 서비스는 Redis 서비스를 제공하므로 이를 활용할 수 있다.

클라우드 서비스 서비스 이름
Amazon Web Services Amazon ElastiCache for Redis
Microsoft Azure Azure Redis Cache

물론 각 클라우드 서비스의 컴퓨터 인스턴스에 직접 Redis를 설치할 수도 있지만, 관리 비용을 고려할 때 이러한 서비스를 선택하는 것이 좋다.

참조




최종 수정 : 2024-01-18