NDM

[5분 테코톡 정리] 캐싱 + EhCache + CaffeineCache 본문

카테고리 없음

[5분 테코톡 정리] 캐싱 + EhCache + CaffeineCache

ndm.jr 2022. 10. 21. 09:13

https://www.youtube.com/watch?v=H4J-8pPMvEU&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=15 

을 보고 정리한 글입니다

 

중간중간 제가 추가한 내용이 포함되어있으니, 영상과는 다를 수 있습니다.


# 캐시

 

  • 데이터 / 값을 미리 복사해 놓는 임시 장소
  • 미리 복사하여 데이터에 더 빠른 속도로 접근 가능

 

https://www.cs.swarthmore.edu/~kwebb/cs31/f18/memhierarchy/mem_hierarchy.html

 

데이터를 빨리 접근할수록 사용가능한 공간은 적어진다. 즉, 저장소의 용량과 속도는 반비례한다.

 


# 종류

 

두 가지만 알아본다. 캐시메모리 / 웹 캐시

 

캐시메모리

속도가 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리

  • CPU가 주기억장치에서 저장된 데이터를 읽어올 때, 자주 사용하는 데이터를 캐시 메모리에 저장한 뒤, 다음에 이용할 때 주기억장치가 아닌 캐시 메모리에서 먼저 가져오면서 속도를 향상
  • 속도라는 장점을 얻지만, 용량이 적기도 하고 비용이 비쌈

 

 

웹 캐시는 크게 3가지로 나뉜다

브라우저 캐시

 

  • 개인의 브라우저에 한정된 캐시
  • 브라우저 또는 HTTP 통신을 하는 Client Application의 내부에 캐시
  • 브라우저의 Back버튼 혹은 이미 방문된 페이지를 재방문 하는 경우 극대화

 

프록시 캐시

  • 네트워크 상에서 동작. 브라우저캐시와 원리는 같음
  • 큰 회사나 IPS 방화벽에 설치되며 대기시간 & 트래픽 감소, 접근정책 & 제한 우회, 사용률 기록 등 수행
  • 한정된 수의 클라이언트를 위하여 무한대의 웹서버의 컨텐츠를 캐시

 

게이트웨이 캐시

  • 서버 앞단에 설치되어 요청에 대한 캐쉬 및 효율적인 분배를 통해 가용성, 신뢰성, 성능 등 향상

# Java에서의 캐시?

 

여기는 나도 몰랐던 내용이다. Integer, Long같은 Wrapper클래스의 캐시 내용이다.

 

 

Integer 클래스의 valueOf 메소드를 보면 IntegerCache라는 것을 사용한다. 이를 뜯어보자

 

Integer클래스가 new 키워드를 통해 생성하고 있는 것 같지만, 위의 코드와 함께 본다면

  • 배열에 캐시를 해두고
  • Integer의 기본  범위인 -128 ~ 127 범위 내에 있다면
  • 새로 생성하지 않고 그대로 돌려주는 것을 알 수 있다.

 

이것을 보고 Java에서 String을 다루는 방식이 바로 떠올랐다. 잠깐만 살펴보자

 

https://devlog-wjdrbs96.tistory.com/247

 

가장 정확한 글이다. Java String은 불변객체라고 알려져있는데, 궁금하면 검색해보기를 바란다.

 

String은 new를 통해 String객체를 생성하지 않고 변수 = "XXX" 의 형식을 통해 초기화를 할 경우,

내용이 같다면(equals) 그 객체를 새로 생성하지 않고 상수풀에 있던 같은 내용의 객체와 연결시켜준다.

 

이 내용을 공부할 때 String이 캐싱되어있다는 표현은 다른 포스팅에서 극히 적었다.

하지만 IntegerCache까지 알고 나니, String도 어떤 관점으로 보면 캐싱이라고 볼 수 있을 것 같기도 하다.

 


# EhCache와 CaffeineCache

 

Java 캐시 라이브러리로 가장 대표적인 두 가지 캐시에 대해 간단히 알아볼 것이다.

 

EhCache

https://www.ehcache.org/documentation/3.1/clustered-cache.html

 

각 어플리케이션의 캐시를 TerraCotta Server에 동기화하여 관리한다.

Java 표준 Cache API인 JCache와 호환되며, CacheManager, CachingProvider을 통해 관리할 수 있다.

 

https://erjuer.tistory.com/127

메모리 저장 공간 / 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라는 것을 활용하여 적절히 캐싱된 데이터를 삭제해주는 것 같다.

 

캐시에서 가장 중요하다고 할 수 있는 성능이라는 측면에서 보았을 때,

읽기 / 읽기 + 쓰기 / 쓰기 모든 측면에서 가장 성능이 좋다. 자세한 지표는 여기에 잘 정리되어 있다.

 

 


출처

https://gyoogle.dev/blog/computer-science/computer-architecture/%EC%BA%90%EC%8B%9C%20%EB%A9%94%EB%AA%A8%EB%A6%AC.html

 

캐시 메모리(Cache Memory) | 👨🏻‍💻 Tech Interview

캐시 메모리(Cache Memory) 속도가 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리를 말한다. CPU가 주기억장치에서 저장된 데이터를 읽어올 때, 자주 사용하는 데이터

gyoogle.dev