일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- Spring Data Redis
- Redis
- 재고 시스템
- 트랜잭션
- JPA
- method area
- 카카오 화재
- nonclustered index
- JAVA8
- Jenkins
- CaffeineCache
- java
- Metaspace
- 제네릭
- 웹캐시
- 공변
- Ehcache
- backend
- lazyloading
- springboot
- 부하테스트
- 동시성
- 지연로딩
- 주문
- 리팩터링
- ci/cd
- GithubActions
- 상태패턴
- B+TREE
- JDK14
- Today
- Total
NDM
[5분 테코톡 정리] 캐싱 + EhCache + CaffeineCache 본문
https://www.youtube.com/watch?v=H4J-8pPMvEU&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=15
을 보고 정리한 글입니다
중간중간 제가 추가한 내용이 포함되어있으니, 영상과는 다를 수 있습니다.
# 캐시
- 데이터 / 값을 미리 복사해 놓는 임시 장소
- 미리 복사하여 데이터에 더 빠른 속도로 접근 가능
데이터를 빨리 접근할수록 사용가능한 공간은 적어진다. 즉, 저장소의 용량과 속도는 반비례한다.
# 종류
두 가지만 알아본다. 캐시메모리 / 웹 캐시
캐시메모리
속도가 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리
- CPU가 주기억장치에서 저장된 데이터를 읽어올 때, 자주 사용하는 데이터를 캐시 메모리에 저장한 뒤, 다음에 이용할 때 주기억장치가 아닌 캐시 메모리에서 먼저 가져오면서 속도를 향상
- 속도라는 장점을 얻지만, 용량이 적기도 하고 비용이 비쌈
웹 캐시는 크게 3가지로 나뉜다
브라우저 캐시
- 개인의 브라우저에 한정된 캐시
- 브라우저 또는 HTTP 통신을 하는 Client Application의 내부에 캐시
- 브라우저의 Back버튼 혹은 이미 방문된 페이지를 재방문 하는 경우 극대화
프록시 캐시
- 네트워크 상에서 동작. 브라우저캐시와 원리는 같음
- 큰 회사나 IPS 방화벽에 설치되며 대기시간 & 트래픽 감소, 접근정책 & 제한 우회, 사용률 기록 등 수행
- 한정된 수의 클라이언트를 위하여 무한대의 웹서버의 컨텐츠를 캐시
게이트웨이 캐시
- 서버 앞단에 설치되어 요청에 대한 캐쉬 및 효율적인 분배를 통해 가용성, 신뢰성, 성능 등 향상
# Java에서의 캐시?
여기는 나도 몰랐던 내용이다. Integer, Long같은 Wrapper클래스의 캐시 내용이다.
Integer 클래스의 valueOf 메소드를 보면 IntegerCache라는 것을 사용한다. 이를 뜯어보자
Integer클래스가 new 키워드를 통해 생성하고 있는 것 같지만, 위의 코드와 함께 본다면
- 배열에 캐시를 해두고
- Integer의 기본 범위인 -128 ~ 127 범위 내에 있다면
- 새로 생성하지 않고 그대로 돌려주는 것을 알 수 있다.
이것을 보고 Java에서 String을 다루는 방식이 바로 떠올랐다. 잠깐만 살펴보자
가장 정확한 글이다. Java String은 불변객체라고 알려져있는데, 궁금하면 검색해보기를 바란다.
String은 new를 통해 String객체를 생성하지 않고 변수 = "XXX" 의 형식을 통해 초기화를 할 경우,
내용이 같다면(equals) 그 객체를 새로 생성하지 않고 상수풀에 있던 같은 내용의 객체와 연결시켜준다.
이 내용을 공부할 때 String이 캐싱되어있다는 표현은 다른 포스팅에서 극히 적었다.
하지만 IntegerCache까지 알고 나니, String도 어떤 관점으로 보면 캐싱이라고 볼 수 있을 것 같기도 하다.
# EhCache와 CaffeineCache
Java 캐시 라이브러리로 가장 대표적인 두 가지 캐시에 대해 간단히 알아볼 것이다.
EhCache
각 어플리케이션의 캐시를 TerraCotta Server에 동기화하여 관리한다.
Java 표준 Cache API인 JCache와 호환되며, CacheManager, CachingProvider을 통해 관리할 수 있다.
메모리 저장 공간 / Off-Heap 공간 / Disk 공간에서 관리가 가능하며
Off-Heap공간의 경우 Java Heap 이외의 공간에서도 관리할 수 있어 GC도 피할수 있는 장점이 있다.
하지만 직렬화 비용을 추가로 감안해야한다.
Caffiene Cache
Google의 오픈소스인 Guava와 Java ConcurrentLinkedHashMap을 바탕으로 개선된 캐시 라이브러리이다.
Java8, Spring4.3, Boot1.4 이상에서만 지원한다.
역시 In-Memory를 활용하지만 ConcurrentHashMap과의 차이점은
ConcurrentHashMap은 해당 Map이 삭제되기 전까지 데이터가 영구보관되며,
CaffeineCache는 Window TinyLfu라는 것을 활용하여 적절히 캐싱된 데이터를 삭제해주는 것 같다.
캐시에서 가장 중요하다고 할 수 있는 성능이라는 측면에서 보았을 때,
읽기 / 읽기 + 쓰기 / 쓰기 모든 측면에서 가장 성능이 좋다. 자세한 지표는 여기에 잘 정리되어 있다.
출처
캐시 메모리(Cache Memory) | 👨🏻💻 Tech Interview
캐시 메모리(Cache Memory) 속도가 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리를 말한다. CPU가 주기억장치에서 저장된 데이터를 읽어올 때, 자주 사용하는 데이터
gyoogle.dev