1. 인메모리 데이터베이스(in-memory database)
메모리에 데이터를 적재하여 활용하는 데이터베이스
인메모리 데이터베이스 주요 특징
1. Millisecond response(1ms = 0.001s)
- 디스크 대비 매우 빠른 응답 속도
- 대량의 트래픽이 몰리는 서비스에 적합
- 빠른 응답 속도로 인한 높은 처리량을 제공
2. Volatility Of RAM
- 메모리 기반으로 데이터가 휘발성임
3. Data types
- 다양한 데이터 타입을 제공
2. CPU, Memory, Disk
- CPU: 연산 처리 - 초당 수십억 건 명령어를 처리하도록 설계되어 있음
- Memory: CPU가 활용하는 주 기억장치인 메인 메모리를 의미하며 일반적으로 RAM을 가리킴
- CPU에서 접근 속도가 Disk보다 빠름, 비용 비쌈
- Disk: 데이터가 영구 저장되는 보조 기억장치로 SSD, HDD 등이 해당
- 처리 속도 느림, 비용 저렴
Memory read/write 100만 번 테스트
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class MemoryReaderWriter {
public static void main(String[] args) {
String sample = "Hello, World!";
List arrList = new ArrayList();
long start = System.currentTimeMillis();
for (int i = 0; i < 1_000_000; i++) {
arrList.add(sample);
}
arrList.stream().collect(Collectors.toList());
long end = System.currentTimeMillis();
System.out.println("Execution time: " + (end-start) + " ms");
}
}
Disk read/write 100만 번 테스트
import java.io.*;
import java.util.Scanner;
public class FileReaderWriter {
public static void main(String[] args) {
final var filename = "test.txt";
final var sample = "Hello, World!";
File file = new File(filename);
long start = System.currentTimeMillis();
// 쓰기
try {
FileOutputStream os = new FileOutputStream(file);
PrintWriter writer = new PrintWriter(os);
for (int i = 0; i < 1_000_000; i++) {
writer.println(sample);
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
// 읽기
try {
Scanner scanner = new Scanner(new File(filename));
while (scanner.hasNextLine()) {
scanner.nextLine();
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
long end = System.currentTimeMillis();
System.out.println("Execution time: " + (end-start) + " ms");
}
}
결과
직접 내 맥북에서 돌려 봤을 때 20배 이상 차이 나는 것을 확인할 수 있었다!
3. Memcached vs. Redis
Memcached
- 기본적인 키-값 저장소로 매우 단순한 기능을 제공
- 메모리에 데이터가 저장되기 때문에 매우 빠른 읽기 및 쓰기 성능
- 주로 웹 애플리케이션의 데이터베이스 쿼리 결과, API 호출 결과, 세션 데이터 등의 캐싱에 많이 사용
- 영구성 없음
- 트랜잭션 미지원
- LRU(Least Recently Used) 방식으로 자동 메모리 관리
Redis
- 키-값 외에도 리스트, set, hash, sorted set 등 다양한 데이터 구조를 지원
- 데이터의 영구 저장을 위해 RDB(Redis Database, Snapshot)과 AOF(Append-Only File)와 같은 여러 가지 영구성 옵션을 제공
- master-slave 복제와 자동 failover 기능을 포함한 클러스터링을 지원
- Lua 스크립트를 사용하여 서버 측에서 복잡한 쿼리나 연산 수행 가능
- 여러 명령어를 하나의 트랜잭션으로 처리 가능
정리
항목 | Memcached | Redis |
데이터 구조 | 단순 키-값 저장소 | 다양한 데이터 구조 지원 (리스트, 셋, 해시 등) |
영구성 | 영구성 없음 | RDB, AOF를 통해 데이터 영구 저장 가능 |
복제 및 클러스터링 | 복제 및 클러스터링 미지원 | 마스터-슬레이브 복제, 클러스터링 지원 |
성능 | 매우 고성능 | 고성능, 데이터 구조에 따라 성능이 다를 수 있음 |
사용 사례 | 웹 애플리케이션 캐싱, 세션 저장 등 | 세션 저장, 실시간 분석, 메시지 큐, 채팅 애플리케이션 등 다양한 사용 사례 |
트랜잭션 | 트랜잭션 미지원 | 트랜잭션 지원 (MULTI/EXEC 명령어) |
스크립팅 | 스크립팅 미지원 | Lua 스크립팅 지원 |
메모리 관리 | LRU (Least Recently Used) 방식으로 자동 메모리 관리 | 사용자가 메모리 관리를 설정할 수 있음 (maxmemory 정책 등) |
반응형