본문으로 건너뛰기
김신건의 로그

[Spring] ConcurrentLruCache

· 수정 · 📖 약 1분 · 284자/단어 #spring #util #concurrent #cache #lru
ConcurrentLruCache, org.springframework.util.ConcurrentLruCache, Spring LRU Cache

정의

org.springframework.util.ConcurrentLruCache<K,V> 는 Spring 5.3+ 의 thread-safe LRU 캐시. 크기 제한이 있고 가장 오래 안 쓰인 entry 부터 제거.

내부적으로 ConcurrentHashMap + ConcurrentLinkedDeque (또는 비슷한 자료구조) 조합으로 동시성과 LRU 순서 모두 지원.

사용

import org.springframework.util.ConcurrentLruCache;

ConcurrentLruCache<String, User> cache = new ConcurrentLruCache<>(
    1000,                                   // capacity
    key -> userRepository.findById(key)     // 미스 시 로더
);

User u = cache.get("alice");   // 캐시 적중 또는 로더 호출
cache.contains("alice");
cache.size();
cache.remove("alice");
cache.clear();

get(key) 가 캐시 미스를 자동으로 처리하는 generator 패턴.

사용 사례

Spring 내부의 reflection / 어노테이션 메타데이터 캐시 일부. 빈 정의 lookup 캐시 등.

LinkedHashMap LRU 와의 비교

항목LinkedHashMap LRUConcurrentLruCache
Thread-safe✗ (외부 동기화 필요)
LRU 순서 유지✓ (accessOrder)
생성 비용작음중간
동시 처리량낮음 (단일 락)높음

단일 스레드면 LinkedHashMap 이 가볍다. 멀티 스레드 환경에서는 ConcurrentLruCache 또는 Caffeine (외부 라이브러리, 더 성능 우위) 가 적합.

Caffeine 과의 비교

Caffeine 은 LRU 보다 W-TinyLFU 알고리즘 사용, 적중률이 LRU 보다 높은 경우가 많다. 대규모 캐시는 Caffeine 권장.

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>

Spring Boot 의 @EnableCaching 에서 기본 backed cache 로 Caffeine 을 자주 선택.

ConcurrentLruCache 는 작은 캐시 또는 Spring 내부 용도에 적합.

참고

이 글의 용어 (4개)
[Java] ConcurrentHashMapjava
정의 는 고동시성 환경에서 사용 가능한 구현. JSR-166 (Java 5) 도입, Java 8 에서 내부 구조가 크게 재작성됐다. 과 같은 인터페이스를 제공하면서 thread-…
[Java] ConcurrentLinkedDequejava
정의 는 lock-free . 의 양방향 버전. JDK 1.7 추가. 양 끝 모두에서 add/remove 가능, 모든 연산이 CAS 기반. 내부 구조 이중 연결 리스트 ( , 모…
[Java] LinkedHashMapjava
정의 는 을 상속해 삽입 순서 (또는 접근 순서) 를 유지 하는 Map. 모든 의 평균 O(1) 성능을 유지하면서 추가로 순회 순서가 일관된다. 핵심: 이중 연결 리스트 (dou…
집합과 맵 (Set and Map)algorithm
정의 집합 (Set) 은 고유한 원소들의 모임을 나타내는 추상 자료구조로, 멤버십 검사, 삽입, 삭제를 지원한다. 맵 (Map, Dictionary) 은 키-값 쌍을 저장하며, …

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기