Redis란?
간단정리 : Key-value store NOSQL DB이다. 싱글 스레드로 동작하며 자료구조를 지원한다. 그리고 다양한 용도로 사용될 수 있도록 다양한 기능을 지원한다. 데이터의 스냅샷 혹은 AOF로 그를 통해 복구가 가능해서 어느정도 영속성도 보장한다.
스프링에서는 세션을 관리하거나, 캐싱을 하는데 자주 사용된다. (backend-interview-question 발췌)
key로 가져올 수 있는 자료형은 기본적으로 String이지만, value는 다양한 타입을 지원함.
메모리 기반 데이터베이스이기 때문에, Disk를 기반으로 하는 RDBMS보다 read가 빠르다.
- RDBMS도 쿼리를 통해 조회해오면, 메모리에 존재하는 Buffered Cache를 이용한다고 함. (cache hit) Buffered Cache를 활용할 대 RDBMS와 레디스는 조회 시간 차이가 없나
RDBMS에서 동일 select문을 n회 조회할 때 (cache hit)와 Redis의 조회 속도를 비교해보면 Redis가 더 빠르다.
과거 AWS에서 Monggo DB를 담당하시는 이덕현 개발자님이 세미나에서 "RDBMS는 데이터 직렬화, 역직렬화 과정이 있기 때문에 레디스보다 느린 것 같다"고 추론했다는 언급했음.
- 자바 해쉬맵과 비교
둘다 key-value 기반이고, 메모리 베이스이며, value를 원하는 표현 방식으로 넣을 수 있다.
그럼. 어플리케이션 개발할 때 HashMap을 사용하면 되지 않는가?
서버가 1대 있다는 가정에서는 Redis의 장점이 크게 보이지 않음. 하지만 분산환경에 대입하면 장점이 보임.
- 분산 환경에서의 장점
유저 요청이 늘어나 서버를 증설 - 동일한 해쉬맵 데이터를 참조해야할 상황 가정
원격 프로세스 간 동일한 해쉬맵 데이터를 참조해야 할 때, 분산환경에선 원격 프로세스간 데이터를 동기화하기 어려움
하여 별도의 레디스 서버를 구성하고 레디스에서 값을 꺼내 쓰면
메모리 기반 데이터 구조의 빠른 응답성을 확보함과 동시에 데이터 불일치 문제도 해결할 수 있음
- DBMS로서의 장점
또한, 어플리케이션이 종료되면 휘발해서 사라지는 HashMap과 달리, Redis는 다양한 영속성(디스크에 백업) 옵션을 제공함.
영속성 외에도 범용 프로그래밍 언어인 java에서 다루기 까다로운 여러 기능도 DBMS로써 갖추고 있다.
TTL(Time to Live) 설정 : 일정 시간이 지나면 데이터 삭제, 용량이 작은 메모리의 효율적 관리
분산 데이터 저장소 구성 -> Redis Cluster 등 분산 환경에서 안정적인 데이터 관리 가능
보안체계 -> 악성 스크립트 공격으로부터 안전 보장, TLS 지원
- TLS (Transport Layer Security)
Redis와 Memcached의 차이?
Redis는 싱글 스레드 기반으로 동작하고, Memcached는 멀티스레드를 지원해서 멀티 프로세싱이 가능하다.
Redis는 다양한 자료구조를 지원하고, Memcached는 문자열 형태로만 저장한다.
Redis는 스탭샷, AOF 로그를 통해서 데이터 복구가 가능하고, 여러 용도로 사용할 수 있도록 다양한 기능을 지원한다.
- 공통점
1) 1ms 이하의 응답대기 시간
1ms 이하의 응답시간을 제공함. 데이터를 메모리에 저장하기 때문에, 디스크 기반의 데이터베이스보다 빠르게 데이터를 읽어올 수 있음.
- 개발의 용이성
문법적으로 사용하기 쉽고, 개발코드 양 또한 적음
- 데이터파티셔닝
데이터를 여러 노드에 분산하여 저장시킬 수 있음.
따라서 수요가 증가할 때 더 많은 데이터를 효과적으로 처리하기 위해 스케일 아웃이 가능함
- 다양한 프로그래밍 언어지원
java, python, C, C++, JavaScript 등
Memcached만의 특징
멀티스레드 지원, 멀티 프로세스 코어 사용가능
스케일 업을 통하여 많은 작업 처리가능
Redis만의 특징
- 다양한 데이터 구조 사용가능
문자열 뿐만 아니라 List, Set, 정렬된 Set 등을 지원함. 예를 들어, Sorted Set을 활용하여 게임유저의 상위랭크 정보를 쉽게 제공 가능
- 스냅샷
특정 지점에서 데이터를 디스크에 저장하여 파일보관 가능
장애 상황시 복구에 사용가능
- 복제
master-slave 구조로, 여러개의 복제본을 만들 수 있음. 데이터베이스 읽기를 확장할 수 있기 때문에 높은 가용성 클러스터를 제공함.
- 트랜젝션
데이터베이스 상태를 변경시키는 작업단위를 의미 원자성, 일관성,독립성, 지속성 특징 있음 Redis 지원
- Pub / Sub messaging
publish (발행)과 Sub(구독)방식의 메세지를 패턴 검색이 가능함.
따라서 높은 성능을 요구하는 채팅, 실시간 스트리밍, SNS 피드 그리고 서버 상호 통신에 사용가능
- 루아 스크립트 지원
매우 경량화 된 절차 스크립트 언어인 루아를 지원한다. eval 명령어를 사용하여 루아 스크립트 실행가능.
- 위치 기반 데이터 타입 지원
Redis는 실시간 위치기반 데이터를 지원한다.
따라서, 두 위치의 거리를 찾거나, 사이에 있는 요소 찾기 등의 작업을 수행할 수 있음.
이를 활용하여 맛집, 길찾기 그리고 지도기반 고성능 제공
주의점
위의 특징만 보면, 모든 상황에서 Redis를 선택해야할 것 같다.
하지만, Redis는 싱글 쓰레드이기 때문에, 1번에 1개의 명령어만 실행할 수 있다. Keys(저장된 모든키를 보여주는 명령어)나 flushall(모든 데이터 삭제)등의 명령어를 사용할 때, 맴캐쉬드의 경우 1ms정도 소요되지만, 레디스의 경우 100만건의 데이터 기준 1초로 엄청난 속도 차이가 있다.
또한, RDB 작업(특정 간격마다 모든 데이터를 디스크에 저장)이 매우 오래걸립니다. AWS, 60기가 메모리 기준으로 10분이나 소요됩니다. Redis 장
애에 원인의 대부분이 해당 기능 때문에 발생하기 때문에 사용할 때 주의해야합한다.
참고자료 : https://sihyung92.oopy.io/database/redis/1
https://redis.io/docs/
Redis, memcached
https://chrisjune-13837.medium.com/redis-vs-memcached-10e796ddd717
프로젝트 구경하기 :
https://github.com/woowacourse-teams/2021-cvi?tab=readme-ov-file
'DB' 카테고리의 다른 글
SQLite3로 가볍게 배우는 데이터베이스 4 (2) | 2024.01.01 |
---|---|
SQLite3로 가볍게 배우는 데이터베이스 3 (1) | 2024.01.01 |
SQLite3로 가볍게 배우는 데이터베이스 2 (1) | 2024.01.01 |
SQLite3로 가볍게 배우는 데이터베이스 1 (0) | 2024.01.01 |