LEVEL 90 QUEST
Redis 캐싱 전략
Redis 캐싱 전략 — DevFoil 바이브코딩 Stage 19, Lv.90
Redis란 무엇인가?
초고속 인메모리 데이터 저장소
Redis는 데이터를 메모리(RAM)에 저장하는 인메모리 데이터베이스입니다.
디스크가 아닌 메모리에 저장하기 때문에 읽기/쓰기가 극도로 빠릅니다.
비유하면, 일반 DB는 서류 캐비닛(디스크)에서 파일을 찾는 것이고, Redis는 책상 위 메모장(메모리)에서 바로 확인하는 것입니다.
Redis의 주요 용도:
비유하면, 일반 DB는 서류 캐비닛(디스크)에서 파일을 찾는 것이고, Redis는 책상 위 메모장(메모리)에서 바로 확인하는 것입니다.
Redis의 주요 용도:
- 캐싱: DB 조회 결과를 메모리에 저장하여 응답 속도 10~100배 향상
- 세션 저장: 로드밸런싱 환경에서 세션 공유
- 레이트 리미팅: API 호출 횟수 제한
- 실시간 카운터: 좋아요 수, 조회수 등
- 메시지 큐: 비동기 작업 처리
캐싱 패턴: Cache-Aside vs Write-Through
상황에 맞는 캐싱 전략 선택하기
| 패턴 | 동작 방식 | 장점 | 단점 |
|---|---|---|---|
| Cache-Aside | 캐시 확인 → 없으면 DB 조회 → 캐시에 저장 | 가장 간단, 필요한 것만 캐시 | 첫 요청은 느림 (Cold Start) |
| Write-Through | DB 저장 시 캐시도 동시에 갱신 | 캐시와 DB 항상 동기화 | 쓰기가 약간 느림 |
| Write-Behind | 캐시에 먼저 쓰고, 나중에 DB에 반영 | 쓰기 성능 최고 | 데이터 유실 위험 |
대부분의 경우 Cache-Aside 패턴으로 시작하는 것을 권장합니다.
// Cache-Aside 패턴 구현
import Redis from 'ioredis';
const redis = new Redis(process.env.REDIS_URL);
// 캐시 래퍼 함수
async function cacheGet(key: string, fetchFn: () => Promise<any>, ttl = 300) {
// 1. 캐시에서 먼저 확인
const cached = await redis.get(key);
if (cached) {
return JSON.parse(cached); // 캐시 히트!
}
// 2. 캐시 미스: DB에서 조회
const data = await fetchFn();
// 3. 캐시에 저장 (TTL 설정)
if (data) {
await redis.setex(key, ttl, JSON.stringify(data));
}
return data;
}
// 사용 예시
app.get('/api/projects/:id', async (req, res) => {
const project = await cacheGet(
`project:${req.params.id}`, // 캐시 키
() => db.project.findUnique({ // DB 조회 함수
where: { id: req.params.id }
}),
600 // 10분 TTL
);
res.json(project);
});
// 데이터 변경 시 캐시 무효화
app.put('/api/projects/:id', async (req, res) => {
const updated = await db.project.update({
where: { id: req.params.id },
data: req.body
});
// 관련 캐시 삭제
await redis.del(`project:${req.params.id}`);
await redis.del(`projects:tenant:${req.tenantId}`); // 목록 캐시도 삭제
res.json(updated);
});
🔒
여기까지는 미리보기입니다
Redis 캐싱 전략
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.