1. Local Cache ? Global Cache?

(1) 로컬 캐시

  1. 장점
    • 해당 인스턴스의 메모리를 참조해 빠른 데이터 접근 가능
    • 해당 인스턴스의 메모리를 참조하므로 네트워크 트래픽 감소
  2. 단점
    • 캐시 데이터 증가 시 메모리 사용량 증가로 인한 성능 저하 가능
    • 캐싱 데이터가 변경되면 여러 서버 간 정합성 문제 발생 가능

(2) 글로벌 캐시

  1. 장점
    • 다중 인스턴스에서 동일한 데이터 공유 가능
    • Sharding 과 Replication 을 활용한 고가용성 보장
  2.  단점
    • 추가 인프라 구성으로 인한 비용 발생
    • 네트워크 지연으로 인해 로컬 캐시보다 응답 속도가 느릴 있음

 

2. 로컬 캐시 종류

(1) EhCache

EhCache는 Java 기반의 오픈 소스 캐시 라이브러리로, 주로 Spring 애플리케이션에서 사용된다.

  1. 특징
    1. Heap 메모리, OffHeap 저장소, 디스크 저장 가능
      • heap memory 저장 공간 : JVM 힙 메모리에 저장
      • offHeap 공간(3버전 부터 도입) : memory heap 외부에 추가적인 유형의 메모리 저장소를 사용할 수 있다. Java GC 가 적용되지 않은 저장소이며, Byte 단위의 큰 캐시를 생성할 수 있다.
      • 디스크 공간 : File 캐시와 유사하게 데이터가 디스크에 저장됩니다.
    2. Terracotta Server와 연계하여 분산 캐시 지원
      • Terracotta Server : 각 캐시 노드들의 허브 역할을 하는 분산 캐시 서버 역할.
      • EhCache Terracotta Server 결합해 캐시 노드들 간의 변경 내용을 공유하기 동기화 한다.

 

(2) Caffeine Cache

Caffeine Cache는 Guava Cache와 ConcurrentHashMap을 개선한 고성능 캐시 라이브러리이다.

  1. 특징
    1. 높은 성능과 낮은 지연시간 제공
    2. LRU(Least Recently Used), LFU(Least Frequently Used), FIFO(First In First Out) 제거 정책 지원
    3. 자동 적응적 캐시 크기 조절 기능 제공

 

(3) Guava Cache

Guava Cache 구글에서 제공하는 Java 기반 캐시 라이브러리로, 간단한 캐싱 기능을 제공한다.

  1. 특징
    1. ConcurrentHashMap 기반으로 Thread-Safe 보장
    2. 다양한 캐시 제거 방식 제공 (사이즈 기반, 시간 기반, 참조 기반)
      1. 사이즈 기반 제거 : 객체 크기가 크다는 의미는 그만큼 무겁게 읽어올 수 있는 것으로 크기가 큰 객체를 캐싱할 때 유용하다.
      2. 시간 기반 제거 : 읽기 이후 설정한 시간이 지난 후 만료한다.
      3. 참조 기반 제거
        • weakReference : 값이나 키가 weakReference 로 감싸져 참조가 없어지면 GC 처리된다.
        • softReference : JVM 메모리가 부족한 경우 GC 처리되는 참조 방식

 

3. Local Cache 성능 비교

  1. 테스트 환경
    • 8 thread 기반 동시성 읽기 작업에서 초당 작업량 / 6 thread 기반 동시성 읽기 작업 + 2 thread 쓰기 작업 처리량 비교
    • Caffeine 이 read(100%) + read(75%)/write(25%) + write(100%) 에서 모두 우수함
  1. 결론
    • Caffeine Cache가 읽기 및 쓰기 작업에서 가장 우수한 성능을 보이며, 자동 조정 기능을 통해 최적의 캐싱 환경을 제공한다.
    • EhCache는 대용량 데이터 처리에 적합하며, Spring 환경과의 연계가 용이하다.
    • Guava Cache 단순한 캐싱이 필요한 경우 적합하다.

 

ref : https://github.com/ben-manes/caffeine/wiki/Benchmarks

 

ref : https://github.com/ben-manes/caffeine/wiki/Benchmarks