
웹 서비스의 성능을 높이는 가장 효과적인 방법 중 하나는 자주 조회되는 데이터를 메모리에 캐싱하는 것이다. AWS ElasticCache에서 대표적으로 Memcached와 Redis 엔진을 지원하는데, 오늘은 이 2가지의 차이점에 대해 알아보고자 한다.
인메모리 캐시란 데이터를 디스크가 아닌 메모리에 저장해 매우 빠르게 접근할 수 있도록 하는 기술을 말한다.
보통 웹서비스나 애플리케이션은 매 요청마다 데이터베이스에서 데이터를 조회하는데, 이는 디스크 I/O가 발생하기에 속도가 상대적으로 느리며 트래픽이 많을수록 지연과 부하가 커진다.
이를 해결하기 위해 사용하는 방식이 인메모리 캐시이다.
RAM 기반 저장
휘발성
자주 조회되는 데이터 저장
부하 분산 효과
Memcached는 가볍고 단순한 Key-Value 기반 캐시 서버이다. 데이터를 문자열 형태의 키와 값으로만 저장하며 복잡한 데이터 구조를 지원하지 않는다.
Memcached 방식의 경우 메모리에만 데이터가 저장되기에 서버가 재시작되면 데이터가 사라진다.
set user:1 "철수" 300
get user:1
위 코드의 결과는 철수로 단순 Key-Value 캐시로만 동작한다.
Redis는 Key-Value 저장방식을 기본으로 하지만 다양한 데이터 구조를 지원한다. 또한 RDB, AOF 방식으로 데이터를 디스크에 저장할 수 있기에 서버가 재시작되더라도 데이터가 유지되는 영속성 기능을 제공한다.
HMSET user:1 name "철수" age 25 city "서울"
HGETALL user:1
# => name: 철수, age: 25, city: 서울
위의 코드는 자료구조 중 해시를 사용한 것으로, 객체처럼 데이터를 저장하고 조회할 수 있다
| 항목 | Memcached | Redis |
|---|---|---|
| 자료 구조 | Key-Value (문자열만) | 다양한 자료 구조 지원 (String, List, Set, Hash, Sorted Set 등) |
| 데이터 저장 | 휘발성 (RAM 기반, 영속성 없음) | 휘발성 + 영속성 지원 (RDB, AOF) |
| 복제 / 클러스터링 | 복제 불가, 단일 노드 중심 | 복제, 클러스터링, 샤딩 지원 |
| Pub/Sub (메시징) | 지원 X | 지원 O |
| 트랜잭션 | 지원 X | MULTI/EXEC 명령으로 지원 |
| 데이터 크기 관리 | 단순 LRU 삭제 | LRU 외 다양한 정책 (LFU, TTL 등) |
| 스크립팅 | 불가능 | Lua 스크립팅 지원 |
| 속도 | 매우 빠름 | 빠르지만 약간의 오버헤드 존재 |