Remote Dictionary Server의 약자
Redis는 오픈소스, 인-메모리 데이터 구조 스토어로, 데이터베이스, 캐시 및 Message Broker로 사용됩니다.
Key - Value 데이터 구조를 사용하며, 문자열, 리스트, set ,Hash 등 다양한 데이터 구조를 지원합니다.
지금까지 써왔던 Mysql와 같은 관계형 데이터베이스(RDBMS)가 아니고 비관계형 데이터베이스 관리 시스템이다.
이는 NoSql이라고도 한다.
NoSql이란?
(간단하게만 알아보자)
Not Only Sql 의 약자로 RDBMS가 아님을 의미한다.
- 서로 연관된 그래프 형식의 데이터를 저장할 수 있는 Graph Store
- Row가 아닌 Column 위주로 데이터를 저장하는 Column Store
- 비정형 대량 데이터를 저장하기 위한 Documnet Store
- 메모리 기반으로 빠르게 데이터를 읽어올 수 있는 Key - Value Store
Redis는 다양한 데이터 타입(문자열, 리스트, 셋, 해시 등)을 지원하므로, 복잡한 데이터 구조를 간단하게 저장하고 조회할 수 있습니다.
특징
- 메모리 기반이기 때문에 디스크를 기반으로 하는 RDBMS보다 Read가 빠름
RDBMS도 쿼리 조회시 메모리에 존재하는 Buffered Cache를 이용한다 ( = Cache Hit ).
그러나 RDBMS는 데이터의 직렬화, 역직렬화 과정이 있기 때문에 Redis보다 느리다.
- 어플리케이션을 종료하면 휘발되어 사라져버리는 HashMap과 달리, Redis는 다양한 영속성(디스크에 백업) 옵션을 제공.
- 또, Java에서 다루기 까다로운 여러 기능도 DBMS로 갖추고 있음.
- TTL 설정 : 일정 시간이 지나면 데이터 삭제, 용량이 작은 메모리의 효율적인 관리
- 분산 데이터 저장소 구성 : Redis Cluster 등 분산 환경에서 안정적인 데이터 관리 가능
- 보안체계 : 악성 스크립트 공격으로 부터 안전 보장, TLS지원 ( TLS은 SSL의 향상된, 더욱 안전한 버전 )
- Pub/Sub 기능: Redis는 서로 다른 애플리케이션 간에 메시지를 주고받는 Pub/Sub 시스템을 지원
- Single Threaded : 한번에 하나의 명령어만 처리 가능. (그러나 get,set 명령어는 초당 10만개 이상 처리 할 수 있을 만큼 빠름)
사용 예시
- 캐싱 : 애플리케이션에서 자주 사용되는 데이터를 Redis에 저장하면, 데이터베이스에 대한 요청을 줄이고 응답시간을 단축 시킬 수 있음.
- 세션 스토어 : 세션 정보를 저장하는데 사용될 수 있음.
- 메시지 브로커 : Pub/Sub 기능을 이용하여, 서로 다른 애플리케이션 간 메시지를 주고받는 데 사용할 수 있음. 이를 통해 시스템 간의 비동기 통신이 가능해짐
이 외에도 작업 큐, 실시간 분석, 빠른 풀텍스트 검색 등 다양한 용도로 사용가능!
자바의 HashMap과의 유사성..?
비슷하다고 생각을 해봤지만 깊게 생각해보지 않은 것 같다..
블로그를 찾아보면서 본인이 Java를 이용해 개발을 하고있는 상황에 Redis를 접했을 때 자바의 HashMap과 유사하다 느껴서 정리 해 놓은 것을 보게 되었다..
나도 그 내용을 참고해서 정리해보고자 한다!!
자바의 HashMap 은 Redis처럼 Key - Value 기반이다.
자바로 애플리케이션 개발을 할 때 굳이 Redis를 연동하지 않고 HashMap을 사용하면 안되는가?
뭐 그래도 되지만 서버가 1대가 있을 때에는 크게 차이가 없을지도 모른다. 그러나 분산 환경을 대입하면 Redis의 장점이 두드러진다고 한다.
CPU에서 둘다 빠르게 접근 할 수 있다!
분산 시스템에서의 장점은?
유저 요청이 크게 늘어나서 서버를 늘렸지만, 동일한 해쉬맵 데이터를 참조해야 할 상황이 있을 수 있다.
이 때 원격 프로세스간에 동일한 해쉬맵 데이터를 참조해야 할 때, 분산시스템에선 원격 프로세스간 데이터를 동기화 하기 어렵다....
이처럼 원격 프로세스 간의 데이터를 일치시키기가 어렵다..
이때 별도의 Redis 서버를 구성하고, 해당 레디스에서 값을 꺼내 쓴다면 메모리 기반 데이터 구조의 빠른 응답성을 확보하고, 데이터 불일치 문제또한 해결 할 수있다!
굿!!
+ 추가
사용시 주의할 점
- 서버에 장애 발생 시 그에 대한 운영 플랜 필요 : 인메모리 데이터 저장소의 특성상, 서버에 장애가 생겼을 시 데이터 유실이 발생 할 수 있음!!!
- 메모리 관리 매우 중요!
- 싱글 스레드의 특성상, 한 번에 하나의 명령만 처리 가능. 그래서 처리하는데 시간이 오래 걸리는 요청 또는 명령은 피해야 함!
이 외에도 Master-Slave 형식의 데이터 이중화 구조에 대한 Redis Replication,
분산 처리를 위한 Redis cluster,
장애 복구 시스템 Redis Sentinel, Redis Topology, Redis Sharding, Redis Failover 등의 Redis를 더 효율적으로 사용하기 위한 개념들이 존재합니다.
다음에 이제 Spring에서 Redis 연동하는 방법을 알아보고 포스팅 해보자!
Spring에서 JWT를 사용하면서 Refresh토큰을 저장하는 용도로 사용하려고 한다!
그럼 이만!
👍참고