[Spring] ConcurrentLruCache
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 LRU | ConcurrentLruCache |
|---|---|---|
| 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 내부 용도에 적합.
참고
- Map
- ConcurrentHashMap
- LinkedHashMap
- [[Spring] ConcurrentReferenceHashMap]]
이 글의 용어 (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) 은 키-값 쌍을 저장하며, …
💬 댓글