[DB] Redis 에 대해서 알아보자
우리 모두는 인기 있는 콘서트 티켓을 예매하거나, 인기 강좌에 수강 신청을 서두르는 등, 한정된 자원을 두고 경쟁해 본 경험이 있을 겁니다. 이런 상황에서 발생하는 대량의 트래픽은 어떻게 안전하고 효율적으로 관리할 수 있을까요? 이 궁금증이 저를 여기 어때 캠퍼니의 유용한 글에 이르게 했습니다. 그들의 글에서 얻은 통찰력을 바탕으로, 저는 Redis라는 흥미로운 기술에 대해 더 알아보고 이를 여러분과 공유하고자 합니다.
Redis&Kafka를 활용한 선착순 쿠폰 이벤트 개발기 (feat. 네고왕)
Redis 란?
Redis는 ‘Remote Dictionary Server’의 약자로, 오픈 소스 인-메모리 데이터 저장소입니다. 이는 데이터베이스, 캐시, 메시지 브로커 등 다양한 용도로 사용되며, 고성능 처리와 빠른 응답 속도가 특징입니다. Redis는 다양한 데이터 구조를 지원하고, 데이터 지속성 및 확장성을 제공함으로써 다양한 애플리케이션에서 널리 활용됩니다
그런데 이미 DB 가 있는데 Redis 를 사용하는 이유가 뭐야?
Redis의 인-메모리 처리 방식은 데이터 접근 속도를 크게 향상시켜, 기존 데이터베이스의 성능을 보완합니다. 이를 통해 자주 사용되는 데이터의 캐싱, 효율적인 세션 관리, 실시간 데이터 처리 등을 가능하게 합니다. 또한, Redis는 확장성이 뛰어나 다양한 애플리케이션 요구 사항을 수용할 수 있으며, 기존 데이터베이스의 부하를 줄이는 데도 기여합니다.
DB는 데이터를 디스크에 직접 저장하기 때문에 서버에 문제가 발생되더라도 데이터가 손실되지는 않습니다. 하지만 매번 디스크에 접근해야 하기 때문에 사용자가 많아질수록 부하가 많아져서 느려질 수 있습니다. 이러한 부하를 감소시키기 위하여 캐시 서버를 사용합니다. 즉 캐시 서버로 이용할 수 있는 것이 바로 Redis 입니다.
그렇다면 인-메모리(In-Memory) 란?
Redis의 인-메모리(In-Memory) 저장소는 데이터를 컴퓨터의 RAM(랜덤 액세스 메모리)에 직접 저장하는 기술입니다. 이 방식은 디스크 기반의 저장보다 훨씬 빠른 데이터 접근과 처리 속도를 제공합니다. 결과적으로, Redis는 높은 성능과 신속한 응답 시간을 자랑하는 데이터베이스 솔루션으로, 특히 실시간 애플리케이션에서 유용합니다.
하지만 Redis의 인-메모리(In-Memory) 저장 방식은 뛰어난 속도와 효율성을 제공하지만, 몇 가지 한계도 존재합니다. 첫째, 데이터 저장 공간이 서버의 RAM 용량에 의존하기 때문에, 대규모 데이터를 처리하는 데는 제한적일 수 있습니다. 둘째, 전원이 꺼지면 메모리에 저장된 데이터가 손실될 수 있으며, 이는 중요한 데이터의 안전성에 영향을 줄 수 있습니다. 마지막으로, 고성능 RAM은 비용이 많이 들 수 있으며, 시스템 확장성과 관리 면에서 복잡성을 증가시킬 수 있습니다.
Redis 특징
이번에는 Redis의 몇 가지 특징에 대해서 알아보겠습니다.
인메모리 데이터 저장소
Redis는 모든 데이터를 RAM 에 저장하여 빠른 데이터 처리와 액세스 속도를 제공합니다. 이는 특히 읽기와 쓰기 작업이 빈번한 애플리케이션에 이상적입니다.
다양한 데이터 구조 지원
Redis 는 단순한 키-값 (Key-Value) 저장소를 넘어서 리스트, 세트, 해시, 정렬된 세트, 비트맵 등 다양한 데이터 구조를 지원합니다. 이를 통해 복잡한 데이터 구조를 효율적으로 관리할 수 있습니다.
지속성 옵션
Redis 는 인메모리 데이터를 디스크에 저장하는 여러 옵션을 제공합니다. Redis는 주로 인메모리 데이터 저장소로 사용되기 때문에 기본적으로 시스템이 재시작되면 모든 데이터가 사라집니다.(휘발성) 하지만, 지속성 옵션을 사용하면 인메모리 데이터를 디스크에 저장하여 시스템 재시작 후에도 데이터를 복구할 수 있습니다.
Redis에서 제공하는 주요 지속성 옵션은 다음과 같습니다.
RDB (Redis Database)
특정 시간 간격으로 전체 데이터 세트의 스냅샷을 디스크에 저장합니다. RDB(Redis Database) 는 비교적 복원 속도가 빠르지만, 마지막 스냅샷 이후에 발생한 데이터는 복구할 수 없습니다.
AOF (Append Only File)
모든 쓰기 연산을 로그 파일에 기록합니다. AOF는 데이터의 손실 가능성을 줄이지만, RDB에 비해 복원 속도가 느릴 수 있습니다.
RDB(Redis Database)와 AOF(Append Only File)의 조합
RDB와 AOF를 함께 사용하여 빠른 복원 속도와 데이터 손실 방지라는 두 가지 장점을 동시에 활용할 수 있습니다.
원자성과 트랜잭션 지원
Redis의 모든 명령어는 원자적으로 실행되며, 여러 명령어를 하나의 트랜잭션으로 묶어 실행할 수 있습니다. 이는 데이터 무결성을 보장합니다.
원자성(Atomicity)
Redis 의 원자성(Atomicity)은 개별 명령어가 완전히 수행되거나 전혀 수행되지 않는 것을 보장합니다. 즉, 어떤 명령어가 중간에 실패하면, 그 명령어의 효과는 전혀 적용되지 않습니다. 이는 데이터베이스의 무결성을 유지하는 데 중요한 역할을 합니다.
스케일 아웃(Scale-out)과 고가용성
Redis는 데이터를 복제, 자동 장애 전환, 분산 클러스터링을 통해 높은 가용성과 확장성을 제공합니다. 이는 대규모, 고가용성이 요구되는 시스템에 이상적입니다.
해당 내용은 자세하게 알아보면 좋을 것 같아, 아래 페이지를 참고하시면 좋을 것 같습니다.
스케일 아웃(Scale-out) 이란?
스케일 아웃(Scale-Out) 은 시스템의 처리 능력을 향상시키기 위해 추가적인 서버(노드)를 도입하는 방식입니다. 이는 기존 시스템에 부하를 분산시키기 위해 더 많은 머신을 추가하는 것을 의미합니다.
스케일 아웃은 클라우드 컴퓨팅, 대규모 웹 애플리케이션, 분산 데이터베이스 시스템 등 다양한 분야에서 널리 사용되는 전략입니다.
Redis 사용 가이드
Docker를 이용하면, 복잡한 설정 없이 몇 개의 명령어만으로 Redis 서버를 쉽게 설정하고 실행할 수 있습니다. 오늘은 Docker를 사용하여 로컬 환경에서 Redis를 실행하는 방법을 소개하고자 합니다.
Redis 이미지 다운로드
docker pull redis
Redis 컨테이너(Container) 생성 및 실행
docker run --name myredis -d -p 6379:6379 redis
Redis Container (컨테이너) 접근
docker exec -it <Docker Redis Container ID> redis-cli
# Docker Redis Container ID : docker ps 명령어로 확인 후 Redis Container ID 입력
Redis 를 활용하여 쿠폰 수 설정 및 확인
# 쿠폰 카운터 값 설정(SET)
SET coupon_count 0
# 필요한 만큼 반복 증가(INCR)
INCR coupon_count
INCR coupon_count
# 결과 확인
GET coupon_count
참고 페이지
Redis란 무엇일까? - Redis의 특징과 사용 시 주의점
nhncloud - 개발자를 위한 레디스 튜토리얼 01