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 |