레디스(Redis) 정리

오준석·2023년 10월 30일
0

TIL (Today I Learned)

목록 보기
103/105

Redis

레디스는 세계에서 가장 인기있는 Key-Value Store 중 하나이다.

Remote Dictionary Server의 약자로, 원격 Dictinary 자료구조 서버 라는 직관적인 이름을 가지고 있습니다.

레디스는 시스템 메모리를 사용하는 키-값 데이터 스토어입니다. 인메모리 상태에서 데이터를 처리함으로써 흔히 사용하는 관계형 데이터베이스(RDS) 그리고 몽고 DB로 대표되는 문서형(Document) 데이터베이스보다도 빠르고 가볍게 동작합니다.

레디스를 사용할 때 크게 2가지 방법을 사용한다.

첫째는 로컬 환경에서 레디스를 호출한다. AWS EC2를 예로 들면 인스턴스에 레디스를 설치해 인스턴스 메모리를 사용해 레디스를 사용하는 방법. 인스턴스의 메모리 여유가 있다면 비용적인 측면으로나 사용성 측면으로 뛰어나다.

두 번째는 클라우드 서비스를 사용해 외부자원을 사용한다. 레디스 랩 등의 서드파티 서비스를 사용해 레디스를 사용하게 되면 통신하는 웹 서버가 아무리 많아도 하나의 프레임워크 바인딩을 사용할 수 있다. 이 경우에 레디스는 여러 웹 서버들의 공유 메모리 역할을 감당할 수 있다. 대부분 백엔드 프레임워크를 지원하고, 모듈을 사용해 적절한 형태로 구현할 수 있어 개발 난이도는 비교적 낮다.

레디스는 관계형 데이터베이스가 아니다. 레디스는 RDS와 달리 데이터 타입(VARCHAR, INT, DATETIME) 등을 지원하지 않는다. 몇 가지 로우 레벨의 데이터 타입을 지원한다.

문자열(String), 해시(Hash), 리스트(List), 셋(Set)

레디스는 데이터베이스가 아니지만, 레디스의 스키마는 존재한다. 데이터를 정규화하고, 데이터의 로우에 대해 일관된 레퍼런스를 가지게 해줄 수 있게 해주는 용도로 존재한다. 이는 데이터 입출력에 도움을 준다.

또한 싱글 스레드(Single Threaded)이다.

한 번에 하나의 명령만 처리할 수 있다. 그렇기 때문에 중간에 처리 시간이 긴 명령어가 들어오면 그 뒤에 명령어들은 모두 앞에 있는 명령어가 처리될 때까지 대기가 필요하다.

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

데이터 베이스가 있는데도 Redis라는 인메모리 데이터 구조 저장소를 사용하는 이유는 무엇일까?

데이터 베이스는 데이터를 물리 디스크에 직접 쓰기 때문에 서버에 문제가 발생하여 다운되더라도 데이터가 손실되지 않는다. 하지만 매번 디스크에 접근해야 하기 때문에 사용자가 많아질수록 부하가 많아져서 느려질 수 있는데 일반적으로 서비스 운영 초반이거나 규모가 작은, 사용자가 많지 않은 서비스의 경우에는 WEB- WAS(웹 애플리케이션 서버) - DB 의 구조로도 데이터 베이스에 무리가 가지는 않는다. 하지만 사용자가 늘어난다면 DB가 과부하 될 수 있기에 이때 캐시 서버를 도입하여 사용한다. 그리고 이 캐시 서버로 이용할 수 있는 것이 바로 Redis 이다.

같은 요청이 여러 번 들어오는 경우 매번 데이터 베이스를 거치는 것이 아니라 캐시 서버에서 첫 번째 요청 이후 저장된 결괏값을 바로 내려주기에 DB의 부하를 줄이고 서비스의 속도도 느려지지 않는 장점이 있다.

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

Look aside cache

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

Write Back

  1. 웹서버는 모든 데이터를 Cache 서버에 저장
  2. Cache 서버에 특정 시간 동안 데이터가 저장됨
  3. Cache 서버에 있는 데이터를 DB에 저장
  4. DB에 저장된 Cache 서버의 데이터를 삭제
  • insert 쿼리를 한 번씩 500번 날리는 것보다 insert 쿼리 500개를 붙여서 한 번에 날리는 것이 더 효율적이라는 원리입니다.
  • 이 방식은 들어오는 데이터들이 저장되기 전에 메모리 공간에 머무르는데 이때 서버에 장애가 발생하여 다운된다면 데이터가 손실될 수 있다는 단점이 있습니다.

Redis 사용에 주의할 점

  • 서버에 장애가 발생했을 경우 그에 대한 운영 플랜이 꼭 필요하다. 인메모리 데이터 저장소의 특성상, 서버에 장애가 발생했을 경우 데이터 유실이 발생할 수 있기 때문이다.
  • 메모리 관리가 중요하다.
  • 싱글 스레드의 특성상, 한 번에 하나의 명령만 처리할 수 있습니다. 처리하는데 시간이 오래 걸리는 요청, 명령은 피해야 한다.

적용 방향

AWS는 Redis용 Amazon ElastiCache라는 최적화된 완전관리형 데이터베이스 서비스를 통해 Redis를 지원하며, 고객은 원하는 경우 AWS EC2에서 자체 관리형 Redis를 실행할 수도 있을 거다.

참고
https://brunch.co.kr/@skykamja24/575
https://wildeveloperetrain.tistory.com/21

profile
개발자를 목표로 열심히 하려고 합니다.

0개의 댓글