Redis - 관계형 데이터베이스와의 차이점 중심
Redis란
- Remote Dictionary Server
- 데이터 저장소
- Database: 백업을 통한 영속성 제공
- Middleware
Redis로 할 수 있는 것
- In-memory 데이터베이스로서 빠른 조회 데이터 저장소로 활용 가능.
- 분산된 서버들 간의 커뮤니케이션
- Pub-Sub, Clustered Session(분산 데이터 저장소로서 활용)
- 내장된 자료구조로 기능구현에 활용할 수 있음.
Redis Key-value 구조의 장점과 단점
장점
- 단순성에서 오는 쉬운 구현
- Hash를 사용해 값을 읽기 때문에 속도가 매우 빠름
- RDB의 Select 문의 경우에는 join, where 등의 여러 구문과 결합되어 사용되어 조회 시 처리가 비교적 오래걸림.
- 분산 환경에서의 수평적 확장성
단점
- Key를 통해서만 값을 읽을 수 있음.
- RDB처럼 데이터를 다채롭게 검색하는 것이 불가능함.
NOSQL 과 RDB의 차이
관계형 DB란?
관계(relation)
- 테이블이라고 말하는 것이 관계이며 attribute(속성)으로 이루어져 있다.
- RDB에서 관계를 테이블 간의 관계만을 의미한다고 생각하는 경우가 있지만 기본적으로는 attribute간의 관계를 의미하는 것이다.
- 즉, 속성으로 이루어진 relation, 테이블 형태로 데이터를 저장하는 DB가 관계형 DB이다.
테이블간의 관계
- 테이블 내에서 속성들이 연관되는 것처럼 테이블들도 서로 연관될 수 있다.
- 일대다, 일대일, 다대다 등.
NOSQL과의 차이점
- 관계가 정의 되어있다는 점이 근본적인 차이점이다.
- NOSQL에서는 관계가 정의 되지 않고 특정 형태로 데이터를 저장한다.
- 관계가 있기 때문에 RDB에서는 Select문과 같은 형태를 통해 복잡한 질의를 수행하여 데이터를 검색할 수 있고 무결성을 제약하여 데이터의 무결성을 높일 수 있다.
RDB 장점과 단점
- RDB 장점과 단점도 결국에는 관계가 있기 때문에 발생한다.
장점
- 무결성 제약조건을 두어 데이터 무결성을 유지할 수 있다.
- 관계를 기반으로 복잡한 질의를 수행할 수 있다.
단점
- 관계가 명확한 고정된 스키마를 정의해야함.
- 관계를 기반으로 조회 시 테이블들을 join하여 가져와야 할 때 많은 연산이 수행됨.
- 데이터들이 복잡한 관계를 맺고 있기 때문에 수평적 확장성이 떨어짐.
NOSQL을 사용하는 것이 적합한 경우
- 데이터의 스키마를 고정하여 데이터 무결성을 강화할 필요 없고 오히려 스키마가 유연하게 변경해야하는 경우
- 분산 환경을 구축해야하는 경우.
NOSQL의 종류
- key-value
- Redis, Memcached, DynamoDB
- Document(JSON)
- Wide-column: 레코드마다 다른 컬럼을 가질 수 있음.
- Cassandra, HBase, Google BigTable
- Graph:
Redis의 사용 목적
DBMS로서
- 데이터를 저장할 수 있고 백업을 통해 영속성을 제공할 수는 있음.
- 하지만, 영속성을 오래 제공하는 방향으로 운영할 경우 오히려 성능이 매우 떨어지기 일반적으로 DBMS로 활용하지는 않음.
Remote Heap로서
- 여러 분산 application에서 공유하는 Heap Memory처럼 활용할 수 있음.
- 이 경우 data Consistency를 제공할 수 있음.
- 대표적으로 Clustered Session기능을 제공.
Middleware로서
- 여러 자료구조를 제공하여 복잡한 로직을 쉽게 구현할 수 있도록함.
In-memory
- 인 메모리 형태로 데이터를 저장하기 때문에 조회 속도를 높이는데 분산 캐시로서 활용할 수 있음.
Spring에서 Redis를 활용하는법
- Spring Data Redis의 추상화 기능 활용
- Redis Client는 Lettuce 구현체 활용 (Jedis는 성능이 매우 떨어지며 업데이트 되고 있지 않음) - 관련 링크
- Cache Manager Redis 구현체 등록 한 이후
- @Cacheable등의 annotation을 활용.
- 단순 캐싱 기능을 제공하려고 하는 경우 AOP를 통해 캐싱 로직 구현이라는 관심사를 분리하고 비지니스로직을 작성하는것에 집중할 수 있기 때문에 이 방법이 적합.
- RedisTemplate Bean객체로 등록하여 사용.
- redis 커맨드를 직접 사용할 수 있기 때문에 단순 캐싱 목적이 아닐 경우 주로 활용.