레디스(Redis)
레디스(Remote Dictionary Server)는 In-Memory 기반의 Dictionary 구조 데이터 관리 서버 시스템을 뜻하는데, 여기서 Dictionary 구조 데이터는 key-value를 의미한다.
다른 것은 그래도 이해가 가는데 그럼 In-Memory라는 게 뭘까?
In-Memory
In-Memory는 컴퓨터의 메인 메모리(RAM)에 데이터를 저장하는 것으로, 말 그대로 데이터가 메모리 안으로 들어간다고 이해하면 쉬울 것 같다.
위의 그림과 같이 CPU는 메인 메모리에 저장된 데이터만 직접 가져올 수 있다. 그렇다면 데이터를 굳이 HDD나 SSD에 저장하는 것이 아닌 메인 메모리에 저장하면 더 빠르게 데이터를 주고받을 수 있기 때문에 In-Memory라는 개념이 탄생하게 된다.
하지만 메인 메모리는 영구적으로 데이터를 관리하기 어렵고 용량이 제한적이다. 왜냐하면 컴퓨터가 꺼지면 당연히 메인 메모리에 있는 데이터도 다 없어지기 때문에 영구적으로 어떤 데이터를 저장한다는 것은 문제가 될 수 있다. 또한 최근에 사용하는 HDD나 SSD는 1TB도 많이 사용하지만 우리가 사용하는 컴퓨터의 메인 메모리는 많아야 32GB 밖에 되지 않는다.
이러한 단점에도 불구하고 메인 메모리는 보조 메모리보다 속도가 수십~수백 배 빠르기 때문에 데이터를 신속하게 처리하고 관리할 수 있다는 큰 장점을 가지고 있다.
레디스 - 캐시(Cache)
레디스는 앞서 In-Memory 기반의 Dictionary 구조 데이터 관리 서버 시스템이라고 설명했는데 여기서 등장하는 개념이 바로 캐시다.
먼저 캐시는 데이터나 값을 미리 복사해 놓는 임시 저장소를 뜻하는데 자주 액세스되거나 계산 비용이 많이 드는 데이터를 메인 메모리와 같이 빠르고 쉽게 액세스 할 수 있는 위치에 저장하여 똑같은 요청이 들어왔을 경우 빠른 서비스를 제공해주는 것이 바로 캐시다.
데이터를 캐시에 저장하게 되면 애플리케이션은 데이터베이스나 API와 같은 느린 데이터 소스에서 데이터를 가져올 필요가 없으므로 응답 시간이 향상되고 서버 로드가 줄어든다.
레디스가 어떻게 동작하는지 위의 그림을 살펴보면 먼저 클라이언트가 데이터를 요청하게 된다면 레디스에서 미리 저장된 데이터가 있는지 확인하고, 만약에 있다면 바로 데이터를 보내주고, 없다면 MySQL 서버에 접근하여 데이터를 찾게 된다.
레디스의 캐시 작업 시 고려해야 될 사항들
캐시의 올바른 데이터 식별: 모든 데이터를 캐시 할 필요는 없다. 자주 변경되지 않지만, 자주 필요하고, 생성하는 데 계산 비용이 많이 드는 데이터를 캐싱하는 데 중점을 둔다.
만료 정책 설정: 캐싱된 데이터에 대한 적절한 만료 정책을 설정한다. 적절한 시기에 캐시가 만료되면 캐시가 최신 상태로 유지되고 오래된 데이터 제공을 방지할 수 있다. 데이터 업데이트 빈도를 확인하고 캐시 된 데이터가 원하는 최신성을 기준으로 만료 시간을 설정한다.
캐시 무효화 구현: 기본 데이터가 변경되면 해당 캐시 항목을 무효화하거나 업데이트하는 것이 필수적이다. 캐시 무효화 알고리즘 또는 데이터 원본의 변경 사항 모니터링과 같은 기술을 사용하여 캐시 무효화 작업을 수행할 수 있다.
캐시 성능 모니터링: 캐시 성능을 정기적으로 모니터링하여 효율성을 확인해야 한다. 캐시 적중률, 캐시 누락 및 전반적인 캐시 활용도를 주시해야 한다. 모니터링은 잠재적인 병목 현상이나 최적화 영역을 식별하는 데 도움이 된다.
높은 트래픽을 위해 레디스 확장: 애플리케이션의 트래픽이 증가하면 증가된 로그를 처리하기 위해 레디스를 확장하는 것이 좋다. 레디스 Cluster 또는 Replication을 사용하여 여러 인스턴스에 데이터를 분산하고 읽기 및 쓰기 처리량을 늘리는 작업이 포함될 수 있다.
레디스 - 캐시외 특징들
- 레디스는 In-Memory 특성상 많은 양의 데이터를 저장하는 데 사용되지 않는다. 또한 데이터의 영구 저장에 사용되지 않는데 그 이유는 데이터를 더 빠르게 저장하고 검색할 수 있지만 시스템이 충돌하면 전체 데이터가 손실되기 때문이다.
- 레디스는 일종의 NoSQL로 분류되기 때문에 일반적인 SQL문과 문법이 다르다.
- 레디스는 세트, 문자열, 해시, 리스트와 같은 다양한 데이터 구조를 제공한다.
- 레디스는 여러 인스턴스를 실행할 수 있으므로 Cluster 혹은 Replication 구성이 가능하다.
- 레디스 서버의 기본 포트는 6379번이다.
레디스의 장/단점
장점
- 속도: 모든 데이터를 메모리에 저장하므로 빠른 읽기 및 쓰기 작업이 가능하다. 그러므로 데이터에 더 빠르게 액세스해야 하는 애플리케이션에 이상적이다.
- 유연성: 리스트, 문자열, 집합, 해시 등 다양한 유형의 데이터 구조를 제공하므로 캐싱, 세션 관리 등과 같은 다양한 유형의 애플리케이션에 사용할 수 있다.
- 확장성: 레디스 서버를 추가하여 확장이 가능하므로 확장성이 뛰어나다.
단점
- 휘발성: 레디스는 In-Memory 기반의 서버이기 때문에 데이터를 영구 저장하지 않는다. 따라서 레디스 서버가 다운되거나 컴퓨터에 문제가 생겨 전원이 꺼지면 캐시에 있던 데이터가 없어지게 된다.
- 싱글 스레드: 레디스는 싱글 스레드 기반으로 돌아가기 때문에 한 번에 하나의 명령어만 실행하게 된다. 따라서 긴 처리 시간이 필요한 명령어를 쓰면 다른 요청을 처리할 수 없게 되고 심각한 경우에는 서버가 다운되는 현상이 일어날 수 있다.
- 메모리 단편화: 데이터를 메인 메모리에 저장하기 때문에 데이터가 자주 변할 경우 단편화 문제가 발생할 수 있다.
'DB' 카테고리의 다른 글
MySQL - 클러스터 (1) | 2023.11.26 |
---|---|
Mysql - Replication (1) | 2023.11.13 |
데이터베이스 - DB 이중화 (0) | 2023.11.12 |
MySQL - View & Index (0) | 2023.11.11 |
데이터베이스 - 인덱스 (0) | 2023.11.10 |