반응형

캐싱이란?

- 애플리케이션 처리 속도를 높여주는 이미 가져온 데이터나 계산된 결과값의 복사본을 저장하여 처리 속도를 향상시키고 , 이를 통해 향후 요청을 더 빠르게 처리할 수 있다. 

- 대부분의 프로그램이 동일한 데이터나 명령어에 반복하여 액세스하기 때문에 캐싱은 효율적인 아키텍쳐 패턴

 

캐싱 적합한 데이터

  • 반복적이고 동일한 결과가 나오는 기능의 반환값
  • 업데이트가 자주 발생하지 않는 데이터
  • 자주 조회되는 데이터
  • 입력값과 출력값이 일정한 데이터
  • 캐싱된 데이터는 데이터 갱신으로 인해 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

+ Recent posts