캐싱이란?
- 애플리케이션 처리 속도를 높여주는 이미 가져온 데이터나 계산된 결과값의 복사본을 저장하여 처리 속도를 향상시키고 , 이를 통해 향후 요청을 더 빠르게 처리할 수 있다.
- 대부분의 프로그램이 동일한 데이터나 명령어에 반복하여 액세스하기 때문에 캐싱은 효율적인 아키텍쳐 패턴
캐싱 적합한 데이터
- 반복적이고 동일한 결과가 나오는 기능의 반환값
- 업데이트가 자주 발생하지 않는 데이터
- 자주 조회되는 데이터
- 입력값과 출력값이 일정한 데이터
- 캐싱된 데이터는 데이터 갱신으로 인해 DB와 불일치가 발생할 수 있다.
=> 그렇기 때문에 데이터 Update가 잦게 일어나거나 데이터 불일치시 비즈니스 로직 상 문제가 발생할 수 있는 기능은 캐싱 대상으로 적합하지 않음
캐싱 타입
- Local Cache
- 서버마다 캐시를 따로 저장한다.
- 다른 서버의 캐시를 참조하기 어렵다.
- 서버 내에서 작동하기 때문에 속도가 빠르다.
- 로컬 서버 장비의 Resource를 이용한다. (Memory, Disk)
- 캐시에 저장된 데이터가 변경되는 경우:
- 해당 서버를 제외한 모든 peer에 변경 사항 전달
- All-to-All Replication
- WAS 인스턴스가 늘어나고, 캐시 저장 데이터 크기가 커지면 성능이 저하되는 이유는 이 때문
- Global Cache
- 여러 서버에서 캐시 서버에 접근하여 참조 할 수 있다.
- 별도의 캐시 서버를 이용하기 때문에 서버 간 데이터 공유가 쉽다.
- 네트워크 트래픽을 사용해야 해서 로컬 캐시보다는 느리다.
- 데이터를 분산하여 저장 할 수 있다.
- Replication: 두 개의 이상의 DBMS 시스템을 Mater / Slave 로 나눠서 동일한 데이터를 저장하는 방식
- Sharding: 같은 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 방법
- 캐시에 저장된 데이터가 변경되는 경우:
- 추가적인 작업 필요없음
- 서비스 확장으로 WAS 인스턴스가 늘어나고, Cache 데이터 크기가 커질 수록 효과적인 이유
캐싱용 인메모리 DB (Redis VS Memacached)
두 기능 모두 NoSQL 형식으로 키-값 형태를 이루어 두 솔루션 모두 캐시 레이어로서 동작
Memcachedsms In-Memory Key-Value 저장소라 한다면, Redis는 단순한 KEY-VALUE를 저장소에서 더 나아가 일종의 데이터 구조 스토어라고 합니다.
자바 언어에서는 Memcached는 Xmemcached과 Memcached-java-client를 제공하고
Redis는 Jedis, Lettuce, Redisson을 제공합니다.
주요 특징 비교
데이터 자료형, 그에 따른 메모리 사용량
Memcached : key와 value가 String 자료형으로 최대 1MB까지 저장 / String으로만 구성되어 Redis 보다 빠르고
Redis의 Hash로 직렬화, 역직렬화 과정을 거치지 않고 객체를 저장할 수 있어 애플리케이션 개발이 수월해지고 IO 과정이 줄어 들어 효율적
Redis : 5개의 데이터 자료형(String, Hash, List, Set, Sorted set)을 사용하며 키와 값 모두 512MB까지 저장 가능
구조 , 확장법
Memcached : 멀티 코어 구조로 된 멀티 쓰레드를 지원 / vertical scale up(=수평적 확장) 으로 확장성 얻음
Redis : 싱글 쓰레드 구조 / 슈평, 수직 확장 가능 / 수평적 확장은 노드 그룹(=샤드) 개수 조정 , 수직 확장은 클러스터 크기 증가
Data Eviction 알고리즘(=메모리 여유공간 없을 때 자원 쫓아낼때 사용되는 알고리즘)
Memcached : LRU(Least Recently Used)
Redis : 하기 8가지 정책 중 선택
noeviction | 메모리가 다 찬 경우 에러 표시 |
allkeys-LRU | 가장 사용되지 않은 데이터 축출 |
volatile-LRU | 가장 사용되지 않음 + 만료 기간 설정 |
allkeys-random | 랜덤하게 축출 |
volatile-random | 랜덤 + 만료 기간 축출 |
volatile-TTL | 제일 짧은 TTL + 만료 기간 설정 |
volatile-lfu | 제일 사용되지 않음 + 만료 기간 설정(Redis 4.0부터 추가) |
allkeys-lfu | 제일 사용되지 않는 데이터 축출(Redis 4.0부터 추가) |
트랜잭션
Memcached : 원자성은 있지만, 트랜잭션 미제공 / 멀티 쓰레드 구조로 여러 쓰레드가 한번에 동일한 트랜잭션 기능에 접근하게되면 원자성을 보장하게되도, 다른 쓰레드의 값과 겹쳐질 수 있음.
Redis : 트랜잭션 기능 제공 / WATCH , MULTI , EXEX 등의 명령어 기반 optimistic lock 기반 트랜잭션 지원
'Web > web dev' 카테고리의 다른 글
Proxy와 사용자 IP(X-Forwarded-For(XFF)) (0) | 2022.05.18 |
---|---|
HTTP/3 (0) | 2022.01.25 |
레이턴시, 대역폭 (0) | 2021.12.16 |
로드밸런스(L4 vs L7) (0) | 2021.12.16 |
LDAP , AD (0) | 2021.05.31 |