Please enable JavaScript.
Coggle requires JavaScript to display documents.
피드화면 Caching에 왜 Redis를 사용했나요? - Coggle Diagram
피드화면 Caching에 왜 Redis를 사용했나요?
왜 캐싱이 필요한가?
RDBMS
Disk 기반
데이터를 읽어오는 과정에서 Input/Output 작업으로 인한 병목 현상이 발생하며, 복잡한 JOIN 연산은 응답 속도를 크게 저하시킴
정형화된 스키마(테이블)
수직 확장(Scale-Up) 중심
트래픽이 몰리면 DB 서버를 스케일업(수직확장)하는데 한계가 있고, 스케일아웃(수평확장)은 구조가 매우 복잡함
NoSQL(Redis)
In-Memory 기반
디스크 I/O 없이 메모리에서 바로 데이터를 읽어와 압도적으로 빠른 응답 속도를 보장
유연한 데이터 모델(Key-Value)
정해진 스키마 없이 다양한 형태의 데이터를 빠르게 저장하고 조회하는 데 유리
수평확장(Scale-out)용이
트래픽 증가 시 서버를 추가하는 방식으로 손쉽게 시스템 전체의 처리량을 늘릴 수 있음
피드화면의 응답속도 극대화, DB부하 최소화 => In-Memory 성능과 피드 구현에 최적화된 다양한 자료구조를 제공하는 Redis 캐싱 솔루션으로 선택
피드서비스의 특성(읽기 > 쓰기)
Look-Aside(Lazy Loading) 전략을 기본으로 사용
새로운 게시물 작성과 같이 중요한 업데이트 발생 시 관련 사용자들의 피드 캐시를 능동적으로 갱신(Cache Eviction/Update)해주는 전력을 혼합
Redis를 활용한 캐싱 전략
Look-Aside Pattern
가장 보편적이고 안정적인 전략
동작방식
Read (데이터 조회)
애플리케이션은 먼저 Redis(Cache)에 피드 데이터가 있는지 확인
(Cache Hit)데이터가 있으면 Redis에서 바로 데이터를 읽어 사용자에게 반환 (매우 빠름)
(Cache Miss)데이터가 없으면 RDBMS(DB)에서 피드 데이터를 조회
DB에서 가져온 데이터를 Redis에 저장하여 다음 요청을 대비
사용자에게 데이터를 반환
Write(데이터 변경 / 생성)
새로운 게시물이 작성돠면 먼저 RDBMS(DB)에 데이터를 저장
그 후 이 게시물이 포함될 피드의 캐시(Redis)를 삭제(Evict)하거나 갱신(Update)하여 데이터의 일관성을 유지
왜 Redis인가?
데이터 구조
Redis : 다양한 자료구조 지원
Strings, Lists,Sorted Sets, Hashes
Memcached : 단순한 Key-Value (Strings)만 지원
Couchbase : JSON Document 기반
Redis : Sorted Set
피드를 구현하는데 있어 '치트키'같은 역할
게시물 ID를 점수(Score)로 타임스탬프를 사용하여 저장
별도의 복잡한 로직 없이도 시간순으로 정렬된 피드 목록을 매우 빠르고 효율적으로 가져올 수 있음
영속성
Redis : 지원(Snapshot, AOF), 서버 재시작 시 데이터 복구 가능
Memcached : 미지원, 서버 재시작 시 캐시 데이터 모두 소멸
Couchbase : 기본지원(DB기능저장), 모든 데이터를 디스크에 저장
확장성/고가용성
Memcached : 단순한 분산 환경 지원 (클라이언트 라이브러리 의존)
Couchbase : 클러스터링 기본 내장, 자동 샤딩 및 리밸런싱 지원
Redis : Sentinel, Cluster 모드를 통한 HA 및 자동 샤딩 지원
이유
Memcached : 단순 Key-Value만 지원, 복잡한 피드 데이터를 다루기 어려움, 영속성 부재로 캐시 데이터의 안정성이 떨어짐
Couchbase : 강력한 기능을 제공하지만 단순 캐싱 목적을 넘어 완전한 데이터베이스 역할까지 겸하고 있어 피드 캐싱이라는 특정 목적에는 다소 무겁고 복잡한 솔루션
Redis : Sorted Set 자료구조는 게시물 타임라인을 정렬하고 관리하는 피드 기능에 완벽하게 부합. 영속성 지원으로 캐시 데이터의 안정성을 높일 수 있음
이 전략을 사용한 이유
구현의 용이성
애플리케이션의 데이터 조회 로직에 간단히 캐시 확인 단계를 추가하는 방식으로 구현이 비교적 간단합니다.
높은 안정성
캐시에 장애가 발생하더라도 DB에서 데이터를 직접 조회하는 로직이 존재하므로, 서비스의 전체 장애로 이어지지 않고 단지 응답 속도만 느려집니다.
자원 효율성
모든 데이터를 미리 캐시에 올려두는 것이 아니라, 사용자가 실제로 요청하는 데이터만 캐시에 적재하므로 메모리 자원을 효율적으로 사용할 수 있습니다.