일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Flutter
- 스프링부트
- JPA공부
- 플러터 공부
- 자료구조공부
- 프로그래머스
- 알고리즘공부
- Axon framework
- querydsl
- 스프링 공부
- 코테준비
- 자바공부
- DDD
- 기술공부
- nestjs공부
- 스프링부트공부
- JPA 공부
- 카프카
- nestjs
- JPA예제
- JPA
- nestjs스터디
- 스프링
- 기술면접공부
- 스프링공부
- K8S
- 플러터 개발
- 코테공부
- JPA스터디
- Kafka
- Today
- Total
DevBoi
[Spring] Memcached 적용 사례 본문
<Memcached가 뭐임??>
무료로 사용할 수 있는 오픈소스이며, 분산 메모리 캐싱 시스템
DB나 API 호출 또는 렌더링 등에서 받아오는 결과 데이터를 작은 key-value 형태로 메모리에 저장하는 방식
1)장점
필요량 보다 많은 메모리를 가졌을때 시스템으로부터 메모리를 사용하고, 필요로하는 메모리가 부족한 경우
이를 쉽게 더 가져다 사용할 수 있도록 만들어준다.
위 두가지는 memcache를 사용하고, 안하고에 따라 다른 것이다.
사용하지 않는 경우, 각 웹서버가 분리된 메모리에서 할당된 크기만큼 사용할 수 있지만
memcache를 사용하는 경우는 논리적 결합으로 인해 각 웹서버는 전체 메모리캐시만큼
용량을 사용할 수 있다.
메모리 캐시를 사용하는 경우, 모든 서버는 동일한 가상 메모리 풀을 공유한다.
특정항목이 주어졌을때, 전체 웹 클러스터에서 항상 동일한 위치에 저장되고 검색이 된다.
이는 스케일아웃이나 용량에 대한 합리적인 소비 측면에서 좋다.
다시 말해
Memcached(맴캐시디)의 사전적 정의로는 범용 분산 캐시 시스템이고, 무료이고 오픈소스이다.
또한 Redis처럼, 고성능 분산 메모리 객체 캐싱 시스템이다.
<저장 구조 및 특징>
key-value 형태로 저장, key를 통해 빠르게 데이터에 접근할 수있다.
데이터로 문자열만 지원, 작고 정적인 데이터를 캐싱할 때 사용된다.
<구조>
데이터를 빠르게 찾기 위한 Hash Table
key,value,ttl 및 기타 정보를 담고 있는 캐시 데이터 구조
메모리 관리자인 Slab Allocator
캐시가 가득 찼을때 캐시 항목의 제거 순서를 결정하는 LRU list
<상세>
1) Hash Table
Memcached에서 빠른 데이터 검색을 위해 해쉬 테이블을 사용한다.
각각의 버킷은 데이터들의 linked-list 형태이다.
그리고 버킷을 배열 형태로 유지, 키의 해쉬값을 통해 빠른 접근이 가능하다.
데이터 접근 시 키 값의 해쉬값을 구하여, 테이블의 인덱스에 해당하는 버킷으로 이동, 원하는 데이터를 찾을 수 있다.
2) Slab allocator
Memcached 의 장점중 하나인 효율적인 메모리 관리이다.
slab이 효율적인 메모리 사용을 제공한다.
Slab은 메모리 할당 단위, chunk의 집합으로 구성되어있다.
Memcached에서는 slab 리스트를 유지하고, 데이터를 저장할 메모리를 할당한다.
다양한 크기의 chunk를 가진 slab class들을 유지하고 있다.
데이터를 저장할 경우, 적절한 크기의 chunk를 가진 slab을 찾아서 저장한다.
1)뭐가 적절한건데?
전통적인 메모리 할당 방식으로 malloc과 free를 통해, 힙 영역에서 메모리를 관리하는 것이 아니라
memcache가 저장할 때 값의 크기를 측정하고 항목과 적절한 크기를 포함하는 슬램을 할당 해주어
슬램 내부의 청크에 저장된다.
기존 청크의 크기보다 크다면, 적절한 크기의 청크로 나누어진 새로운 슬랭이 만들어지기도하고
새 항목이 기존 청크에 적합하지만 빈 청크가 없다면 새로운 슬램이 만들어 진다.
기존 항목이 업데이트되어 크기가 커지게 되도, 같은 방식으로 슬램이 생성되어 재 할당 된다.
슬램 내부 청크가 다 차있다면, 슬램 클래스 내부에서 LRU 알고리즘에 의해 미 활용 청크를 선정, 업데이트 한다.
사용가능한 메모리를 미리 할당해 두고 사용하기 때문에 malloc/free함수보다 빠른 할당이 가능하고 메모리 파편화가 덜 일어나게 됩니다.
2)malloc/free가 뭔데?
malloc 은 메모리를 동적으로 할당하는 함수이고, free는 할당된 메모리를 해제해주는 함수이다.
자바의 경우 jvm이 자동으로 이 메모리 관리를 해주기 떄문에 별도로 신경쓸 필요는 없다
또한 메모리를 해제를 직접 해주어야, 가능하다.
LRU list
LRU는 잘 쓰이지 않는 것부터, least recent used였나, 무튼 최근에 사용안한거를 삭제하는 알고리즘이다.
double-linked-list형태로 구현되어있다. 캐시항목에 접근한 순서를 유지하고
가장 오래되어 사용하지 않은 항목을 찾을 수 있게, 삭제가 필요하면 삭제를 진행한다,.
Memcached는 Lazy-Expiring 정책을 사용한다. 키가 만료되어도, 노드에서 삭제하지 않는다
만료된 키에 접근할 경우, 키를 검사하여, 만료여부를 확인 후 메모리에서 제거하게 된다.
즉. 삭제 작업자체는 누군가가 접근할때 발생된다.
1)정확한 삭제 동작, Lazy-Expiring
캐시 데이터 구조
Memcached에서 캐시 데이터를 저장하기 위해 key/value 이외에도 추가적인 데이터를 포함한 구조를 사용한다.
1) key, key의 길이
2) data,data의 크기
3) 만료 시간
4) 최근 접근 시간
5) 해쉬 테이블에서 다음 노드를 가르키는 포인터
6) 해당 캐시 항목에 동시에 접근하는 스레드 수
7) 캐시항목 상태 플래그
근데 왜 안써?
Memcached 는 키 이름이 250byte로 제한
캐시 값의 용량은 1MB로 제한
String만 지원가능
Redis 처럼 데이터 타입과 API가 다양하지 않다.
데이터 변경이 잦은 경우엔 메모리 파편화가 발생하기 쉽다.
그럼 쓰는 사람들은 뭐야?
Db/api 통신을 줄이기 위해 데이터를 캐싱 처리하는 데에 사용하면 좋은 캐시
트래픽이 몰려도 응답속도는 안정적인 편이다. (꽤나 극단적인 경우)
내부적으로 slab 할당자를 사용하고 있어서 메모리할당이 잦지 않다 -> 메모리 파편화 문제가 적다.
Redis에 비해, 메타 데이터를 적게 사용하므로, 메모리 사용률이 상대적으로적다.
실제 적용 방법
우선 이론적인건 더 찾는 대로 위에 정리를 하도록하고 스프링에 바로적용해서 보자
<윈도우 설치>
참고해서 진행하면 된다.
첨부파일도 있으니, 참고를 자알 하면된다.
'Develop > [Spring]' 카테고리의 다른 글
[Spring] bean scope , 싱글톤과 프로토 타입 빈 (0) | 2022.12.15 |
---|---|
[Spring] 간단한 지식... mybatis Camel 변환 (0) | 2022.10.22 |
[Spring] 기본 화면 변경_대기화면 기능 완료 (0) | 2022.09.24 |
[Spring] 기본 화면 구성 (0) | 2022.09.24 |
4. Spring Data JPA, H2 Setting (0) | 2022.07.03 |