Caffeine Cache 간단하게 뜯어먹기

최혜미·2024년 7월 18일
0

cs

목록 보기
34/34
post-thumbnail

Caffeine은 Java 진영에서 가장 빠르고 똑똑한 로컬 캐시 라이브러리입니다.
이 글에서는 Caffeine의 개념부터, Spring 연동, 내부 구조, 그리고 성능이 뛰어난 이유까지 전부 정리합니다.


Caffeine이란?

"진짜 똑똑한 로컬 캐시"

  • Guava Cache 만든 개발자가 성능 불만족으로 새로 만든 캐시 라이브러리
  • Spring 애플리케이션에서 가장 많이 쓰이는 로컬 캐시
  • TTL, LRU, LFU, 최대 사이즈 제한, 자동 갱신 등 다양한 기능 탑재
  • 성능은 Redis 없이도 쓸 정도로 빠름 (단, 로컬 환경 한정)

한줄 정의

JVM 기반 고성능 캐시 라이브러리로
LRU, LFU, TTL, 최대 용량 관리, 자동 리프레시 기능을 갖춘
Lock-Free 구조의 초고속 로컬 캐시


Spring에서 어떻게 써?

@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개까지만 저장


카페인 캐시 내부 구조: 왜 이렇게 빠를까?

핵심 알고리즘 3가지

  1. Window TinyLFU

    • LRU + LFU 결합 알고리즘
    • 최근 쓰인 애 + 자주 쓰인 애 둘 다 남김
    • Count-Min Sketch로 자주 사용 여부 판단
  2. maximumSize 기반 자동 삭제

    • 사이즈 제한 초과 시 덜 쓰인 애부터 제거
  3. TTL 만료 처리

    • expireAfterWrite, expireAfterAccess 지원
    • TTL이 지나면 get/put 시점에 자동 제거됨 (게으른 삭제 방식)

흐름 요약

put(key, value)
 → Window 공간에 저장
 → 자주 쓰이면 Main 영역으로 승격
 → 많이 쌓이면 덜 쓰인 애부터 자동 제거

get(key)
 → 있으면 바로 리턴
 → 없으면 load하고 저장

카페인 캐시 구조를 까보면?

┌─────────────────────────────┐
│        CaffeineCache        │ ← 우리가 사용하는 껍데기
└─────────────────────────────┘
           │
           ▼
┌───────────────────────────────────────────────┐
│              BoundedLocalCache                │ ← 진짜 로직
│                                               │
│  ┌────────────┐  ┌────────────┐  ┌────────┐   │
│  │ WindowCache│  │ MainProbation││MainProtected│ ← 내부 공간
│  └────────────┘  └────────────┘  └────────┘   │
└───────────────────────────────────────────────┘
  • Window → 신규 진입 대기 공간
  • Probation → 메인 진입 후보군
  • Protected → 상위 랭커들, 자주 쓰이는 애들

TTL 처리 방식

Caffeine.newBuilder()
    .expireAfterWrite(10, TimeUnit.MINUTES)
  • 캐시 항목에 만료 타임스탬프 부여
  • get(), put() 등 접근 시점에 TTL 검사
  • 별도 스케줄러는 없음 (게으른 TTL)

Count-Min Sketch란?

  • 자주 쓰인 항목 판단하는 lightweight 통계 도구
  • 정확하진 않아도 대충 "자주 쓰였는지" 감 잡기
  • 메모리 절약 + 빠른 계산

부가기능

기능설명
recordStats()캐시 통계 기록 (히트율 등)
refreshAfterWrite()백그라운드 자동 갱신
removalListener()제거 이벤트 감지

단점

항목단점
메모리 기반서버 꺼지면 데이터 날아감
분산 불가로컬 캐시라 서버 간 공유 불가
Java 전용다른 언어와의 통신 불가

실무에서는 이렇게 씀

시나리오추천 캐시
단일 서버, 속도 중요Caffeine
서버 여러 대, 공유 필요Redis
둘 다 필요Redis + Caffeine (멀티 캐시 구조)

비유로 쉽게

Caffeine:

"야 나 똑똑하니까 넣기만 해, 지울 건 내가 알아서 할게"
(TTL, 용량 초과 다 알아서 처리)

Redis:

"나는 모두가 보는 공유 공간이야. 대신 네트워크 비용 좀 들지~"


한줄 요약

Caffeine은 단일 서버에서 TTL, 사이즈, 성능 걱정 없이
초고속 캐싱을 날먹하게 도와주는 Lock-Free 캐시입니다.

Redis 도입 전 단계로 딱 알맞고,
캐시 잘 몰라도 그냥 put만 하면 됩니다.

0개의 댓글