파란배개 2025. 6. 11. 12:46

Context

문제 상황

우리 프로젝트는 ‘구글 트렌드 api 기반으로 실시간 키워드로 AI 뉴스를 만들어주는 웹 페이지’이다.

그럼 생각해보자. 구글 트렌드 api 기반으로 인기있는 키워드를 10개를 받아야한다. 그리고 그걸 기반으로 AI 뉴스를 만들고 페이지에 올려야 된다. 단순히 키워드를 10개 받고 끝내면 상관없지만, 여기서 주요로 봐야할 웹 페이지의 특징은 실시간이다.

실시간으로 데이터를 받아, 실시간으로 그 데이터를 처리한다. 여기서 디스크 기반으로 데이터를 저장하는 MySql를 사용하여 실시간으로 데이터를 저장하고 읽는데 사용한다고 생각해보자!

 

데이터베이스를 처리하다가 컴퓨터가 처리될 것이다! 사실 지금 같은 소규모 프로젝트에서는 상관없겠지만, 사용자가 몇만 명이나 있는 웹 페이지에서는 MySql같은 데이터베이스를 사용해 처리하면 속도가 어마무지하게 느릴 것이다.

이걸 처리하기 위해서는 무엇을 해야될까?

 

Decision

제안 내용 및 이유

여기 우리와 같이 고민하는 사람이 있다.

이 분은 어릴적부터 컴퓨터에 관심이 많았고, 컴퓨터 소프트웨어를 공부해서 2009년에 한 페이지를 만들었다.

https://lloogg.com/

이 사이트는 실시간으로 방문자 수집 서비스를 갖추고 있다. 이 사이트가 홍보되면서 여러 사람들이 사이트로 몰려오고 많은 트래픽이 들어오기 시작했다.

지금은 여러 데이터베이스들이 개발되었지만, 당시는 옛날이었고 쓸 수 있는 데이터베이스의 선택지가 많이 없었을 뿐더러 그마저도 느렸다.

그래서 Salvatore는 직접 총대를 매서 한 데이터베이스를 개발해 사이트에 적용했다!

그것이 바로 이 Redis(Remote Dictionary Server)라는 것이다!

Redis는 Mysql처럼 디스크를 사용하지 않고 인메모리로 데이터 구조를 가진 DB이다.

Salvatore는 기존에 사용하던 Mysql 대신 Redis를 사용했는데

와우! DB 로드 그래프를 보면 어마하게 트래픽이 줄어든 것을 확인할 수 있다!

그 이후 Redis는 현재까지도 인스타그램, 트위터 등 다양한 SNS에도 사용하고 많은 대기업 웹 사이트들에게도 사랑받는 데이터베이스가 되었다.

Consequences

제안된 기술 도입의 장단점

장점

  • 매우 빠름: 데이터를 메모리에 저장하고 관리하기 때문에 디스크 I/O로 인한 지연이 없다. 이로 인해 읽기/쓰기 작업에서 초당 수십만 건의 요청을 처리할 수 있을 정도로 속도가 매우 빠르다.
  • 다양한 데이터 구조 지원: 단순한 키-값 형태 외에도 리스트(List), 세트(Set), 정렬된 세트(Sorted Set), 해시(Hash), 비트맵(Bitmap), 하이퍼로그로그(HyperLogLog), 지오스페이셜(Geospatial) 인덱스 등 다양한 고급 데이터 구조를 지원하여 개발 편의성을 높이고 여러 사용 사례에 적용 가능하다.
  • 지속성 옵션 제공: 기본적으로 인메모리 데이터베이스지만, 데이터를 디스크에 저장하는 RDB(점진적 스냅샷) 및 AOF(명령어 로그 기록) 방식을 지원하여 서버 재시작 시 데이터 손실 위험을 줄일 수 있다.
  • 원자성 보장: Redis의 모든 명령어는 원자적으로(Atomic) 실행된다. 즉, 하나의 명령어가 실행되는 동안 다른 명령어는 끼어들 수 없어 데이터의 일관성을 유지하는 데 도움이 된다.

단점

  • 높은 비용: 데이터를 메모리에 저장해야 하므로, 디스크 스토리지에 비해 메모리(RAM) 비용이 더 비싸다. 저장해야 할 데이터의 양이 많을수록 비용 부담이 커진다.
  • 데이터 크기 제한: 기본적으로 서버의 사용 가능한 RAM 용량만큼만 데이터를 저장할 수 있다. 물리적인 메모리 용량의 한계가 데이터 저장 용량의 한계로 직결된다.
  • 속성 사용 시 성능 영향: 데이터 지속성(RDB 또는 AOF)을 활성화하면 데이터 유실 위험은 줄어들지만, 디스크 I/O가 발생하므로 쓰기 성능에 일정 부분 영향을 줄 수 있다. 특히 AOF 설정을 fsync always로 하면 안정성은 높아지지만 성능 저하가 크다.
  • 단일 스레드 아키텍처: Redis의 핵심 프로세스는 기본적으로 단일 스레드로 동작한다. 대부분의 명령어는 매우 빠르게 실행되지만, 시간이 오래 걸리는 명령어(예: 복잡한 Set/Sorted Set 연산, KEYS 명령어 등)가 실행되면 해당 작업이 완료될 때까지 다른 모든 명령어가 블록(Block)되어 전체 시스템의 응답 속도가 느려질 수 있다.

우리가 여기서 알아야 할 장점은 매우 빠름이다. 빠른 대신에 인메모리 방식의 단점이 드러나 있다. 그래서 새 데이터는 Redis로, 예전 메모리는 Mysql을 사용해 저장하는 방법이 제일 효율적이다.

Alternatives

다른 대안

Mysql를 사용하여 이렇게 되거나

Memcached, IMDG 같은 Redis와 비슷한 기능을 하는 데이터베이스를 사용하면 된다!

  • Redis와의 차이점IMDG: Redis의 데이터 구조 외에 분산 트랜잭션, 복잡한 쿼리, 분산 컴퓨팅 기능 등 더 강력한 분산 데이터 처리 기능이 필요하다면 고려해 볼 수 있다. 일반적으로 설정 및 관리가 Redis보다 복잡할 수 있다.
  • Memcached: Redis의 다양한 데이터 구조나 지속성, 복제, 메시지 브로커 기능 등이 필요 없이 오직 빠르고 분산된 캐싱 기능만 필요하다면 Memcached가 좋은 대안이 될 수 있다. 단순성 덕분에 성능 면에서 경우에 따라 Redis보다 약간 더 빠를 수도 있다.

각 DB마다의 장단점이 있으니, 잘 살펴보고 골라야 될 것 같다!

Adoption & Next Steps

최종 채택 사항 및 차후 과제

이제 Redis가 왜 유용하고 어떤건지 알았으니 사용법을 알아야 한다!

하단의 참고에 있는 Redis 강의를 참고하고 아래에 있는 링크로 설치 방법을 알도록 하자!

https://www.elancer.co.kr/blog/detail/768