데이터 캐싱: IMemoryCache, Redis

1. 개요

서버를 운영하다보면 DB 접근을 최소화 하기 위해 데이터를 캐싱해야 할 경우가 생긴다.

이때 C# 서버의 경우 대표적인 캐싱 방법으로 IMemoryCache와 Redis가 있다.

두 기술은 각각의 특성과 장단점이 있어 상황에 맞게 선택해야 한다.

 

 

2. IMemoryCache와 Redis

2.1. IMemoryCache란?

IMemoryCache는 .NET의 메모리 기반 캐싱 라이브러리로, 애플리케이션 서버의 로컬 메모리에 데이터를 저장한다.

 

1) 특징

  • 서버 로컬 캐시 (해당 서버에만 저장)
  • 매우 빠른 속도 (RAM에서 직접 접근)
  • 애플리케이션과 생명주기 공유 (서버 재시작 시 캐시 초기화)

2) 장점

  • 매우 빠른 읽기 속도 (메모리 직접 접근)
  • 별도 설정 없이 쉽게 사용 가능
  • 단순한 구조 (Key-Value 형태)

3) 단점

  • 여러 서버가 있을 경우 캐시 공유 불가능
  • 서버가 재시작되면 캐시 데이터 손실
  • 서버 메모리를 사용하므로 대량 데이터 저장에는 부적합

 

2.2. Redis란?

Redis는 인메모리 데이터 저장소로, Key-Value 형태의 NoSQL 데이터베이스이다.

 

1) 특징

  • 네트워크 캐시 (여러 서버에서 공유 가능)
  • 영속성 지원 가능 (옵션에 따라 디스크 저장)
  • 다양한 데이터 구조 지원 (List, Set, SortedSet 등)

2) 장점

  • 여러 서버에서 캐시 공유 가능 (분산 캐싱)
  • 서버가 재시작되어도 데이터를 유지할 수 있음
  • 대량 데이터 처리 가능
  • TTL(Time To Live) 기능으로 자동 만료 설정 가능

3) 단점

  • 네트워크를 통해 접근해야 하므로 로컬 메모리보다 속도가 느릴 수 있음
  • 별도 Redis 서버가 필요하여 운영 부담 발생
  • 데이터 영속성 설정 시 성능 저하 가능

 

2.3. IMemoryCache vs Redis 비교표

항목 IMemoryCache Redis 
저장 위치 서버 메모리 별도 서버(메모리 DB)
데이터 공유 같은 프로세스에서만 접근 가능 여러 서버에서 접근 가능
속도 매우 빠름 (로컬 메모리) 빠름 (네트워크 통신 포함)
지속성 서버가 내려가면 데이터 삭제 지속 가능 (설정에 따라 영속 저장)
사용 목적 일시적 캐싱, 서버별 독립 데이터 글로벌 캐싱, 공유 데이터 관리
주요 활용 예 API 응답 캐싱, 세션 관리 랭킹 시스템, 접속 유저 관리, 분산 처리

 

 

3. 선택 가이드

조건 IMemoryCache Redis
서버 내에서만 데이터 사용 적합  ( O ) 부적합  ( X )
여러 서버에서 데이터 공유 불가능 ( X ) 가능  ( O )
캐시 데이터 유지 필요 (서버 재시작 후) 불가능  ( X ) 가능  ( O )
대량 데이터 캐싱 성능 저하 가능  ( X ) 적합  ( O )
속도가 가장 중요한 경우 빠름  ( O ) 네트워크 지연 가능  ( X )
TTL을 설정하여 자동 만료 가능 (기본 지원. O) 가능  ( O )

 

3.1. IMemoryCache를 선택해야 하는 경우

  • 특정 서버에서만 사용하는 데이터
  • 빠른 응답이 중요한 경우
  • 데이터가 휘발성이어도 괜찮은 경우
  • 게임 리소스 데이터 같이 자주 조회되지만 변경이 적은 데이터

 

3.2. Redis를 선택해야 하는 경우

  • 여러 서버에서 데이터를 공유해야 하는 경우
  • 지속성이 필요한 경우 (서버 재시작 후에도 유지)
  • 정렬, TTL, Pub/Sub 등 Redis의 기능이 필요한 경우
  • 실시간 랭킹, 유저 세션 관리 등 분산 환경에서 일관성이 필요한 데이터

 

 

4. 결론

사실 둘중 하나만을 선택하는 것보다 두 가지를 함께 사용해 적절하게 적용하는 것이 효율적이다.

서버 내부 캐싱(IMemoryCache)과 글로벌 캐싱(Redis)을 조합하여 사용하면 성능과 확장성을 모두 확보할 수 있다.

 

4.1. 예시

1) 로컬 캐싱 (IMemoryCache)로 처리할 데이터

  • 게임 내 아이템, 스킬, 몬스터 정보 등 리소스 데이터
  • 일정한 값을 반환하며 자주 조회되는 API 응답 결과
  • 서버별 설정 데이터

2) 글로벌 캐싱 (Redis)으로 처리할 데이터

  • 접속 중인 유저 리스트
  • 글로벌 랭킹 데이터
  • 서버 간 통신이 필요한 실시간 정보

 

실제로 처음 사용해보면 캐싱은 편하고 속도가 빨라 많은 데이터를 캐싱하고 싶은 유혹에 빠지게된다.

하지만 캐싱을 하게되면 캐시 데이터가 DB의 데이터와 불일치하는 경우가 발생할 수 있으므로 정말 캐싱해도 되는지 잘 고려해서 적용해야 한다.

또한 캐싱을 함으로써 발생할 수 있는 문제(cache stampede 등)도 있기 때문에 해당 문제들이 발생할 수 있는지, 어떻게 방지할 수 있을지도 고민하며 설계하는 것이 좋다.

'생각 정리' 카테고리의 다른 글

책, 강의 정리  (0) 2024.06.10
컴퓨터의 덧셈과 뺄셈  (0) 2024.05.30
레퍼런스 변수와 포인터 변수  (0) 2024.04.29
재귀함수  (0) 2024.04.28
배열  (0) 2024.04.22