DB가 느려졌어요! 트래픽 폭주를 막는 방패, 캐시(Cache)
웹 서비스를 운영하다 보면 사용자가 몰리는 이벤트 기간이나 트래픽 집중 시간대에 서버가 버벅거리는 현상을 겪게 됩니다. 원인을 파악해 보면 대부분 웹 서버(WAS)의 문제라기보다는, 하드디스크(Disk)를 기반으로 동작하는 데이터베이스(DB)에 쿼리가 집중되면서 발생하는 병목현상인 경우가 많습니다.
이럴 때 DB의 서버 사양을 높이는 스케일 업(Scale-up)을 할 수도 있지만, 가장 비용 효율적이고 똑똑한 해결책은 바로 '캐시(Cache)' 서버를 도입하는 것입니다. 그리고 이 캐시 서버 분야에서 전 세계 1등으로 사용되는 압도적인 기술이 바로 Redis(레디스)입니다.
오늘은 레디스가 도대체 무엇인지, 그리고 실무에서 레디스를 활용할 때 가장 많이 사용하는 2가지 캐시 전략(Caching Strategy)에 대해 완벽하게 정리해 보겠습니다.
1. Redis(레디스)란 무엇인가?
REmote DIctionary Server의 약자인 Redis는 메모리(RAM)를 기반으로 데이터를 저장하고 조회하는 '인메모리(In-Memory) NoSQL 데이터베이스'입니다.
우리가 흔히 쓰는 오라클(Oracle)이나 MySQL 같은 관계형 DB는 데이터를 안전하게 보관하기 위해 하드디스크(SSD/HDD)에 저장합니다. 하드디스크는 용량이 크고 전원이 꺼져도 데이터가 날아가지 않지만, 속도가 느리다는 치명적인 단점이 있습니다.
반면, 레디스는 데이터를 컴퓨터의 주기억장치인 RAM에 저장합니다. 전원이 꺼지면 데이터가 날아가는 휘발성이지만, 하드디스크와는 비교조차 할 수 없을 정도로 압도적으로 빠른 읽기/쓰기 속도를 자랑합니다.
그래서 실무에서는 메인 DB 앞단에 레디스를 배치하여, 자주 조회되는 데이터를 미리 레디스에 올려두고(캐싱) 0.001초 만에 응답을 뱉어내도록 아키텍처를 구성합니다.
2. 실무에서 가장 많이 쓰는 캐시 전략 2가지
레디스를 도입했다고 해서 끝이 아닙니다. 이 빠른 메모리 공간을 어떻게 활용할 것인지 '전략'을 세워야 하는데요. 서비스의 성격에 따라 가장 많이 쓰이는 두 가지 전략을 소개합니다.
① Look Aside (또는 Cache Aside) 전략 : '조회'가 많을 때
백엔드 실무에서 80% 이상 사용되는 가장 대중적인 캐시 전략입니다. 데이터를 찾을 때 항상 '캐시'를 먼저 쳐다본다는 뜻입니다.
사용자가 데이터를 요청하면 앱은 먼저 Redis(캐시)를 확인합니다.
Cache Hit (데이터가 있음): 레디스에 데이터가 있다면 메인 DB까지 가지 않고 즉시 데이터를 반환합니다. (엄청난 속도!)
Cache Miss (데이터가 없음): 레디스에 데이터가 없다면 그제야 메인 DB로 가서 데이터를 조회합니다.
조회해 온 데이터를 레디스에 저장(캐싱)해 두고, 사용자에게 반환합니다.
장점: 레디스 서버가 죽더라도 메인 DB에서 데이터를 가져올 수 있어 장애에 강합니다. (단, 이때 메인 DB로 엄청난 트래픽이 몰리는 'Cache Stampede' 현상은 주의해야 합니다.)
② Write Through 전략 : '데이터 일관성'이 중요할 때
DB에 데이터를 저장할 때, 메인 DB와 Redis에 '동시에' 데이터를 쓰는 전략입니다.
사용자가 데이터를 수정/생성합니다.
앱은 데이터를 메인 DB에 쓰는 동시에, Redis에도 똑같이 업데이트를 쳐줍니다.
장/단점: 캐시와 메인 DB의 데이터가 항상 100% 똑같이 유지된다는(데이터 일관성) 엄청난 장점이 있습니다. 하지만 데이터를 쓸 때마다 DB와 캐시 두 군데에 모두 작업을 해야 하므로 '쓰기(Write) 속도'가 느려지고, 자주 안 보는 데이터까지 전부 캐시에 저장되므로 비싼 RAM 메모리 낭비가 심하다는 단점이 있습니다.
캐시 아키텍처의 핵심은 '만료 시간(TTL)' 설정
오늘은 레디스의 기본 개념과 대표적인 캐시 전략에 대해 알아보았습니다.
레디스를 실무에 적용할 때 가장 중요한 것은 RAM 용량은 한정되어 있고 매우 비싸다는 사실을 기억하는 것입니다. 모든 데이터를 레디스에 욱여넣다 보면 금방 메모리가 가득 차서 서버가 다운(OOM)될 수 있습니다.
따라서 레디스에 데이터를 저장할 때는 반드시 TTL(Time To Live, 만료 시간)을 설정하여, 일정 시간이 지나면 캐시 데이터가 스스로 삭제되도록 설계하는 것이 핵심이자 기본소양이라는 점! 꼭 잊지 마시길 바랍니다.
'프로그래밍&DB' 카테고리의 다른 글
| React 피로감의 반격? 2026년 웹 생태계를 뒤흔드는 'HTMX'와 SSR의 귀환 (3) | 2026.05.18 |
|---|---|
| [프로그래밍/운영체제] C언어의 30년 독재가 끝났다? 리눅스 커널과 백엔드를 점령한 'Rust(러스트)' 완벽 가이드 (0) | 2026.05.16 |
| [DB/트렌드] 2026년 백엔드 개발자 필수 지식: 벡터 데이터베이스(Vector DB)의 개념과 기존 RDBMS의 진화 (1) | 2026.05.11 |
| [HTML/JS] input 태그 한글/영문 입력 제어하기 (ime-mode의 몰락과 최신 자바스크립트 대체 방법) (3) | 2026.05.09 |
| [HTML/CSS] 스크롤을 내려도 따라다니는 상단 메뉴바 고정하기 (position: fixed 완벽 이해) (3) | 2026.05.06 |