MQ

[Redis] in-memory database란?

jolocal 2024. 3. 6. 13:39
728x90

in-memory database


in-memory는 컴퓨터의 메인 메모리를 의미합니다.

database는 컴퓨터의 데이터를 저장할 수 있는 시스템을 말합니다.

메모리를 데이터를 적재하여 활용하는 데이터베이스 시스템을 말합니다.

 

in-memory database 주요 특징


메모리를 데이터베이스로서 사용한다는것은 어떤 의미를 말할까요?

1. Millisecond Response (1ms = 0.001s)

디스크 대비 매우 빠른 응답속도를 보장합수있습니다. ms 단위의 빠른 응답속도를 보장하기 위한 시스템에서 활용하기 적합하며, 대량의 트래픽을 init되는 서비스에서 이용하기 유용합니다. 빠른 속도로 인한 높은 처리량을 제공하기 때문입니다.

2. Volatility of RAM

메모리를 활용하기 때문에 데이터가 휘발성 속성을 가지는것 또한 특징입니다..

예를들어 의도치않은 시스템 종료나 재시작, 커널 문제 등으로 인해 시스템이 다운되었을때 메모리에 저장되어있던 모든 데이터들을 유실됩니다. 디스크를 활용하는 데이터베이스와 비교하여 가용성면에서 충분한 고려가 필요합니다.

3. Data Types

다양한 데이터 타입을 제공합니다. in-memory database 종류에 따라 다를 수 있지만 String, HashTablie, List 등 다양한 자료구조들을 제공합니다.

 


++ 컴퓨터 시스템 응답속도 관련 배경

응답속도와 관련하여 배경을 좀 더 설명하겠습니다.

 

일반적인 컴퓨터 시스템에선

연산 처리를 하는 CPU

CPU가 활용하는 주요 저장소MAIN MEMORY

그리고 영구 저장 가능한 보조 저장 매체 DISK

 

이렇게 3가지 레이어로 나눌 수 있습니다.

 

CPU는 초당 수십억건의 명령어를 처리할 수 있도록 설계되어 있습니다.

그리고 CPU를 위해 설계된 MEMORY 또한 처리 속도가 빠르도록 만들어 졌습니다.

 

 

처리 속도면에서 CPU가 단연 빠르고 MEMORY, DISK 순으로 차이가 납니다. 반면 가격은 반대죠.

MEMORY랑 DISK를 비교한다면 DISK 가격대비 대용량 데이터를 저장하기 적합하지만 MEMORY는 그에 맞게 활용하려면 훨씬 더 많은 비용이 발생하게 됩니다.

 

실제로 자바 코드를 통해 간략하게 검증을 해 볼 수 있습니다.

메모리에 읽기 쓰기와 디스크에 읽기 쓰기 속도를 비교해보겠습니다.

 

Memory read/write 100만번 테스트

public class MemoryReadWriter {
    public static void main(String[] args) {
        String sample = "This is sample String";
        List arrayList = new ArrayList();

        long start = System.currentTimeMillis();
        for (int i = 0; i < 1_000_000; i++){
            arrayList.add(sample);
        }

        arrayList.stream().collect(Collectors.toList());

        long end = System.currentTimeMillis();
        System.out.println("Exception time: " + (end-start) + " ms");
    }
}

 

 

Disk read/write 100만번 테스트 - (쓰기)

public class FileReadWriter {
    public static void main(String[] args) {
        final var filename = "clip01.txt";
        final var sample = "this is sample String";
        File file = new File(filename);
        
        long start = System.currentTimeMillis();
        
        try{
            OutputStream 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();
        }
    }
}

 

Memory, Disk read/write 100만번 테스트 결과

Memory Disk
1회차 17 ms 1회차 407 ms
2회차 17 ms 2회차 420 ms
3회차 29 ms 3회차 370 ms

 

여러번 실행해본 결과 개발환경에서는 약 20배 정도 차이가 나는 것을 볼 수 있습니다.

일반적으로 메모리와 디스크는 수십배에서 수천배 정도 차이가 난다고 합니다.

 

 

in-memory database 오픈 소스


  • Memcached
    • Cache
  • Redis

대표적인 in-memory database 오픈 소스에는 Memcached와 Redis가 있습니다.

과거에는 Memcahced가 꽤 많이 활용되었었는데요, 분산 저장소로 단일 데이터 타입만 제공합니다.

대규모 cache 데이터를 저장하고 지리하는데에 유용한 데이터베이스 입니다.

 

Redis 데이터베이스 또한 분산 저장소 입니다.

Memcached에 비해 다양한 자료 구조를 지원하고 cache 뿐만 아니라 session 저장소 pub/sub, reader board, geospatial 와 같은 지도 데이터등에 다양하게 활용되고 있습니다.

 

 

in-memory database 정리


1. 메인메모리
2. 빠른 응답속도, 높은 처리량
3. memcached, redis

 

in-memory database는 메모리에 데이터를 적재하여 활용하는 데이터베이스 시스템을 의미합니다.

이를 통해서 빠른 응답속도와 높은 처치량을 제공함으로써 대용량 트래픽에 cache로써 활용됩니다.

대표적인 in-memory database로는 memcached와 redis가 있습니다.

 

728x90