Caffeine은 Java 진영에서 가장 빠르고 똑똑한 로컬 캐시 라이브러리입니다.
이 글에서는 Caffeine의 개념부터, Spring 연동, 내부 구조, 그리고 성능이 뛰어난 이유까지 전부 정리합니다.
"진짜 똑똑한 로컬 캐시"
JVM 기반 고성능 캐시 라이브러리로
LRU, LFU, TTL, 최대 용량 관리, 자동 리프레시 기능을 갖춘
Lock-Free 구조의 초고속 로컬 캐시
@Bean
public CacheManager cacheManager() {
Caffeine<Object, Object> caffeine = Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.recordStats();
return new CaffeineCacheManager("users", "products") {{
setCaffeine(caffeine);
}};
}
→ "users", "products" 라는 이름의 캐시를 생성하고
→ 10분 후 만료되며, 최대 1000개까지만 저장
Window TinyLFU
Count-Min Sketch로 자주 사용 여부 판단maximumSize 기반 자동 삭제
TTL 만료 처리
expireAfterWrite, expireAfterAccess 지원put(key, value)
→ Window 공간에 저장
→ 자주 쓰이면 Main 영역으로 승격
→ 많이 쌓이면 덜 쓰인 애부터 자동 제거
get(key)
→ 있으면 바로 리턴
→ 없으면 load하고 저장
┌─────────────────────────────┐
│ CaffeineCache │ ← 우리가 사용하는 껍데기
└─────────────────────────────┘
│
▼
┌───────────────────────────────────────────────┐
│ BoundedLocalCache │ ← 진짜 로직
│ │
│ ┌────────────┐ ┌────────────┐ ┌────────┐ │
│ │ WindowCache│ │ MainProbation││MainProtected│ ← 내부 공간
│ └────────────┘ └────────────┘ └────────┘ │
└───────────────────────────────────────────────┘
Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
| 기능 | 설명 |
|---|---|
recordStats() | 캐시 통계 기록 (히트율 등) |
refreshAfterWrite() | 백그라운드 자동 갱신 |
removalListener() | 제거 이벤트 감지 |
| 항목 | 단점 |
|---|---|
| 메모리 기반 | 서버 꺼지면 데이터 날아감 |
| 분산 불가 | 로컬 캐시라 서버 간 공유 불가 |
| Java 전용 | 다른 언어와의 통신 불가 |
| 시나리오 | 추천 캐시 |
|---|---|
| 단일 서버, 속도 중요 | Caffeine |
| 서버 여러 대, 공유 필요 | Redis |
| 둘 다 필요 | Redis + Caffeine (멀티 캐시 구조) |
Caffeine:
"야 나 똑똑하니까 넣기만 해, 지울 건 내가 알아서 할게"
(TTL, 용량 초과 다 알아서 처리)Redis:
"나는 모두가 보는 공유 공간이야. 대신 네트워크 비용 좀 들지~"
Caffeine은 단일 서버에서 TTL, 사이즈, 성능 걱정 없이
초고속 캐싱을 날먹하게 도와주는 Lock-Free 캐시입니다.Redis 도입 전 단계로 딱 알맞고,
캐시 잘 몰라도 그냥put만 하면 됩니다.