본문 바로가기

DB

[Redis] Redis 특성 및 Redis와 Memcached 비교

1.1 Redis란 무엇인가?

  • 대규모 서비스를 운영하는 업체에서 자주 등장하는 기술들 == 항상 데이터의 안정적인 저장과 빠른 처리를 원함
    • NoSQL, Cache, Redis, Memcache, Sharding 등
  • 그 중 Redis는
      1. Cache 솔루션이라고 정의하기도 하고
      1. NoSQL의 key-value 스토어로 분류하기도 한다.
  • Cache 솔루션과 NoSQL의 key-value 스토어의 공통적인 특징
    • ⇒ 사용하기 쉽고 + 속도가 빠름

대규모 서비스를 제공하는 기업들의 Redis 사용 정보

  • 트위터 → 1억 5천만명의 액티브 사용자를 위해서 800대 Redis를 사용
  • 핀터레스트 → 오브젝트 캐싱 용도로 사용하고 있다.
  • 인스타그램 → Redis가 핵심이라고 할 정도로 인스타그램 서비스의 중요한 부분(메인 피드, 세션)등을 처리
  • 텀블러 → 분산 서비스를 위해 Redis를 사용
  • 라인 → 수십억 개의 행을 저장하기 위해 Redis를 사용

1.2 Redis의 주요 특성

1) Key-Value 스토어

  • 단순 스트링에 대한 Key-Value 구조를 지원하는 데이터 저장소
  • set id:username "username" -> 이렇게 데이터를 저장할 수 있다.

2) 컬렉션 지원

  • 레디스의 주요한 특성은 “컬렉션 지원”이다.
    • List, Set, Sorted Set, Hash 등의 자료구조를 지원한다.
  • 일반적으로 사용하는 컬렉션은 하나의 서버 내부에서 동작한다.
    • 그러나 레디스를 사용하면 이런 특성을 분산 서버 환경에서 처리할 수 있어서, 전체적인 서비스 설계하거나 구현할 때 많은 이점을 얻을 수 있다.

3) Pub/Sub 지원

  • Publish/Subscribe 기능을 지원한다.
    • 서버 간 통지가 필요할 때 이 기능이 매우 유용하다.

4) 디스크 저장

  • In-memory DB 임에도 불구하고,메모리 데이터를 disk에 저장할 수 있는 특징으로 서버가 꺼진 후 다시 시작하더라도 디스크에 저장해놓은 데이터를 다시 읽어 메모리에 로딩하기 때문에 데이터가 유실되지 않는다.

 

  • 1) Redis의 특징 중 하나는 현재의 메모리 상태를 디스크에 저장
    • 현재 메모리 상태의 스냅샷을 RDB 기능 → 메모리 내용을 저장하는 기능 외에 아무것도 지원하지 않는다.
    • 덤프한 내용은 다시 메모리에 올려 사용할 수 있다.
    • 직접 세팅하지 않더라도 Redis는 자동으로 .rdb 라는 확장자의 파일에 인메모리 데이터를 저장하도록 디폴트 설정
    •  장단점
      • 장점 = 파일 사이즈가 AOF보다 작아 로딩 속도가 빠르다
      • 단점 = 스냅샷을 추출하는데 시간이 오래 걸리고 도중에 서버가 꺼지면 데이터가 모두 사라진다.
    • 저장방식
      • RDB 저장 방식에는 SAVE와 BGSAVE 두 가지가 있다.
      • SAVE = SAVE는 순간적으로 redis의 동작을 정지시키고 그 snapshot를 디스크에 저장.(blocking 방식)
      • BGSAVE = BGSAVE는 백그라운드 SAVE 라는 의미로 별도의 자식 프로세스를 띄운 후, 명령어 수행 당시의 snapshot을 disk에 저장하고, redis는 동작을 멈추지 않게 된다. (non-blocking 방식)
  • 2) 현재까지의 업데이트 관련 명령을 저장할 수 있는 AOF 기능이 있다.
    • “Append Only File” → set, del 등의 업데이트 관련 명령을 받으면 해당 명령어를 그대로 기록해둔다. (실행될 때마다 기록)
    • 장단점
      • 장점 = AOF는 바이너리 파일인 RDB와 달리 텍스트 파일이므로 수정이 가능하다
        • log 파일에 대해서만 Append하기 때문에 데이터가 사라지지 않는 장점
      • 단점 = 모든 쓰기, 수정 연산을 로그로 남기기 때문에 로그 데이터 양이 크다
        • 재시작시 모든 쓰기, 수정 연산을 다시 실행
  • Redis에서 가능하면 이 두 개를 모두 사용하는 것이 좋다고 하지만, 디스크를 사용해서 저장하는 만큼 성능 손실은 어느 정도 감수해야한다.

5) 복제

  • Redis는 마스터, 슬레이브 리플리케이션을 지원한다.
  • 마스터에 장애가 발생하면 슬레이브로 서비스하거나 마스터의 부하가 많을 때에는 슬레이브를 이용해서 읽기를 처리할 수 있다.
  • 대규모 서비스에서 Redis를 저장소로 안정적으로 사용하려면 복제 기능을 반드시 이용해야한다.

6) 빠른 속도

  • Redis 선택하는 가장 큰 이유는 성능이다.
  • 초당 50,000 ~ 60,000 QPS 이상의 처리 속도가 필요하다면 → Redis나 Memcached를 사용해야한다.
    • QPS는 "Queries Per Second"의 약자로, 초당 질의(쿼리) 처리 수를 나타내는 단위입니다. 쉽게 말해, 시스템이나 서비스가 매초 처리할 수 있는 요청 또는 쿼리의 수

1.3 Redis와 Memcached 비교

  • Memcached는 캐시 솔루션이고 이러한 Memcached에 저장소 개념이 추가된 것이 Redis 라고 할 수 있다.
    • 캐시 == 빠른 속도를 위해서 어떤 결과를 저장해 두는 것을 의미하며, 또한, “데이터가 사라지면 다시 만들 수 있다”는 전제를 내포하고 있다.
      • 그런데 “저장소”라는 개념이 추가되면 “데이터가 유지되어야 한다”는 특성을 가지게 된다.
      • ⇒ 즉, Redis는 이러한 특성을 말미암아 디스크에 저장하는 RDB나 AOF, 복제가 추가된 것이라고 보면 된다.
  • 이외에도 Redis는 컬렉션이라는 자료구조(List, Hash, Set, Sorted Set)를 제공하므로 개발 생산성 측면에서 볼 때 Redis > Memcached이다.

기능 Redis Memcached

속도 초당 100,000 QPS 이상 초당 100,000 QPS 이상
자료구조 key-value, List, Hash, Set, Sorted Set 지원 key-value만 지원
안정성 특성을 잘못 이해할 경우, 프로세스 장애 발생 장애 거의 없음
응답 속도의 균일성 Memcached보다 균일성이 떨어질 수 있음 전체적으로 균일함
메모리 할당 구조 • jemalloc  
• 매번 malloc과 free를 통해서 메모리 할당이 이루어진다.    
• 메모리를 할당하여 Redis는 메모리 fragmentation등이 발생 → 할당 비용 발생 → 응답 속도가 느려진다. • slab  
• 내부적으로는 메모리 할당을 다시 하지 않고 관리하는 형태    
스레드 싱글 스레드 멀티 스레드
  • 응답 속도의 균일성 → 메모리 할당 구조가 다르기 때문에 발생