Redis란?

곽태민·2023년 5월 26일
0

TIL

목록 보기
28/63

💡 Redis란?


Redis는 key, value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템(DBMS) 이다. 데이터 베이스, 캐시, 메세지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소다.

🤔 Redis가 인메모리 데이터 구조 저장소를 사용하는 이유는?

데이터 베이스는 데이터를 물리 디스크를 직접 사용하기 때문에 서버에 문제가 발생해서 다운되더라도 데이터 손실이 되지 않는다. 하지만 매번 디스크에 접근해야 해서 사용자가 많아지면 부하가 많아져 느려질 수 있다.

일번적으로 서비스 운영 초반이거나 규모가 작고, 사용자가 많지 않은 서비스일 경우 WEB - WAS - DB 구조로가도 데이터 베이스에 무리가 가지 않는다.

하지만 사용자가 늘어나면 데이터 베이스에 과부하가 걸릴 수 있기 때문에 이러한 이유로 캐시 서버를 도입하여 사용한다. 이 캐시 서버로 사용할 수 있는 것이 바로 Redis다.

캐시는 한번 읽어온 데이터를 임의의 공간에 저장해서 다음에 읽을 때 빠르게 결과값을 받을 수 있도록 도와주는 공간이다.

같은 요청이 여러번 들어와도 매번 데이터 베이스를 거치는게 아니라 캐시 서버에서 첫 번째 요청 이후에 저장된 결과값을 바로 내려주기 때문에 데이터 베이스 부하를 줄이고, 서비스 속도도 개선시킬 수 있는 장점이 있다.

캐시 서버는 Look aside cache, Write Back 패턴이 존재한다.

Look aside cache는 다음과 같다.

  1. 클라이언트가 데이터를 요청
  2. 웹서버는 데이터가 존재하는지 Cache 서버에 먼저 확인
  3. Cache 서버에 데이터가 있으면 데이터 베이스에 데이터 조회를 하지 않고, Cache 서버에 있는 결과값을 클라이언트에게 바로 반환 (Cache Hit)
  4. Cache 서버에 데이터가 없으면 DB에 데이터를 조회해서 Cache 서버에 저장하고 결과값을 클라이언트에게 반환 (Cache Miss)

Write Back

  1. 웹서버는 모든 데이터를 Cache 서버에 저장
  2. Cache 서버에 특정 시간 동안 데이터가 저장된다
  3. Cache 서버에 있는 데이터를 데이터 베이스에 저장
  4. 데이터 베이스에 저장된 Cache 서버의 데이터를 삭제

Write Back 같은 경우는 Insert 쿼리를 한 번씩 500번 날리는 것 보다 500개를 붙여서 한 번에 날리는 것이 더 효율적이라는 원리이다.

해당 방식은 들어오는 데이터들이 저장되기 전에 메모리 공간에 머무르는데 이때 서버가 장애 발생 시 다운되면 데이터가 손쇨될 수 있는 단점이 있다.

💥 Redis 특징


Key, Value 구조여서 쿼리를 사용할 필요가 없으며, 데이터를 디스크에 쓰는 구조가 아니라 메모리에서 데이터를 처리하기 때문에 속도가 빠르다.

String, Lists, Sets, Sorted Sets, Hashes 자료 구조를 지원한다.

  • String: 가장 일반적인 key - value 구조의 형태
  • Sets: String의 집합으로, 여러 개의 값을 하나의 value에 넣을 수 있다. 포스트의 태깅 같은 곳에 사용될 수 있다.
  • Sored Sets: 중복된 데이터를 담지 않는 Set 구조에 정렬 Sort를 적용한 구조로, 랭킹 보드 서버 같은 구현에 사용할 수 있다.
  • Lists: Array 형식의 데이터 구조로, List를 사용하면 처음과 끝에 데이터를 넣고 빼는건 빠른지만 중간에 데이터를 삽입/삭제가 어렵다.

또 다른 특징으로는 Single Threaded다. 한 번에 하나의 명령만 처리를 할 수 있다. 그래서 중간에 처리 시간이 긴 명령어가 들어오면 그 뒤에 명령어들은 모두 앞에 있는 명령어가 처리될 때 까지 대기가 필요하다.

(하지만 get, set 명령어일 경우 초당 10만개 이상 처리할 수 있을만큼 빠르다.)

🫢 Redis 사용 시 주의할 점


서버 장애가 발생했을때 그에 대한 운영 플랜이 반드시 필요하다. 인메모리 데이터 저장소 특성상 서버에 장애발생 시 데이터 유실이 발생할 수 있기 때문이다.

또한 메모리 관리가 중요하며, 싱글 스레드의 특성상 한 번에 하나의 명령만 처리할 수 있으므로 처리 시간이 오래 걸리는 요청이나 명령은 지양해야한다.

이 외에도 Master-Slave 형식의 데이터 이중화 구조에 대한 Redis Replication과 분산 처리를 위한 Redis Cluster,

장애 복구 시스템 Redis Sentinel, Redis Topology, Redis Sharding, Redis Failover 등의 Redis를 더 효율적으로 사용하기 위한 개념들이 존재한다.

profile
Node.js 백엔드 개발자입니다!

0개의 댓글