Redis #1 : Redis의 정의와 NoSQL의 종류

2021. 11. 25. 13:58학습일지

이번 챕터에서는 레디스에 대한 정의를 간략하게 하고, Redis와 같은 NoSQL의 특징에 대해 살펴보겠다.

Index

  1. Redis란?
  2. Redis Database란?
  3. Redis Database의 작동원리
  4. Redis의 이점
  5. NoSQL DB란?
  6. NoSQL DB의 종류는?
  7. NoSQL Database의 장점은?
  8. NoSQL Database의 단점은?
  9. 애플리케이션과 Redis DB의 커넥션의 획득하는 방법1. Redis란?레디스는 오픈소스 기반(BSD)의 인메모리 기반 데이터베이스이며, 높은 성능을 제공한다. 레디스를 통해 개발자는 여러가지 형태의 데이터를 다룰 수 있다. 대표적으로 문자열, 해시, 리스트, set(+ sorted), 비트맵, 하이퍼로그, geospatial index와 스트림이 있다.

레디스는 다양한 애플리케이션 코드로 활용할 수 있는데, 구체적인 부분은 https://redis.io/clients를 참고하자.

2. Redis Database란?

레디스는 NoSQL DB이며, key-value의 형태로 데이터를 저장한다. 인메모리 데이터베이스 특성상, 저장되는 데이터는 메모리에 할당된다. key-value의 형태의 데이터 모델을 가졌지만, 문자열, 리스트, 정렬된 혹은 그렇지 않은 set, 해시 스트림, 하이퍼로그, 비트맵, 스트림 등의 여러 형태의 데이터도 지원한다.

3. Redis Database의 작동원리

MongoDB, PostgreSQL, Oracle, Cassandra등의 다른 데이터베이스는 데이터를 하드디스크 혹은 SSD에 저장하지만, 레디스에 저장되는 데이터는 모두 메모리 안에 저장된다. 디스크에 접근할 필요가 없기 때문에, 데이터를 조회할 때 걸리는 시간을 절약할 수 있다. 따라서, 데이터들은 마이크로초 단위로 접근할 수 있다. 레디스 데이터베이스의 인스턴스는 각각의 키의 공간을 가졌는데, 이 공간은 해시 테이블을 래핑한다. 어떠한 형태의 데이터로 저장되든, 레디스가 지원한다면, 전부 해시 테이블안에 저장된다고 할 수 있다.

4. Redis의 이점

다음과 같이 정리해볼 수 있다.

  1. 인메모리 데이터 저장소(빠른 데이터 접근)
  2. 다양한 데이터 구조 지원
  3. 간단하고 쉬운 사용법
  4. 높은 접근성
  5. 복제가 용이하고, 데이터의 영속성을 확보하기 쉽다.
  6. 확장성

5. NoSQL DB란? NoSQL DB의 대표적인 예시

NoSQL DB는 기존의 관계형 테이블로 데이터를 저장하는 형태와는 많이 다르다. NoSQL DB는 관계형 데이터를 저장할 수 있지만 저장하는 형태는 관계형 데이터베이스와는 매우 다르다. 몇가지 예시를 제시하자면, MongoDB, CouchDB, CouchBase는 문서형 NoSQL DB이다. Redis는 key-value 저장소이고, Cassandra and HBase는 컬럼 기반 저장소이고, Neo4J는 그래프 기반 데이터베이스이다.

SQL 데이터는 릴레이션간의 조인을 허용하지만, NoSQL은 연관된 데이터들이 하나의 데이터 구조에 중첩된 형태를 허용한다.

6. NoSQL DB의 종류는?

대표적으로 Key-Values Stores, Wide-column Stores, Document Databases, Graph Databases가 있다. 하나 씩 정리해보자면..

6.1. Key-Values Stores

  • Key-Values Stores는 가장 구현하기 쉽고 단순하다. 이 구조는 내부적으로 해시 테이블을 사용하여, 유니크 키와 특정 데이터를 가리키는 포인터를 활용한다.
  • Key-Values Stores는 단순하지만 많은 양의 데이터를 조회해야하는데, 특화된 저장소이다.
  • 대표적으로, Tokyo Cabinet/Tyrant, Redis, DynanoDB, Voldemort, Oracle BDB, Amazon SimpleDB, Riak)

6.2. Wide-columns Stores

  • 데이터를 동적인 컬럼과 로우의 형태를 가진 테이블로 저장하는 구조이다.
  • 기존 RDBMS와 다른 점을 꼽자면, 각 데이터의 로우는 컬럼이 동일할 필요가 없다는 것이다. 따라서, RDBMS보다 훨씬 유연한 형태의 데이터를 저장할 수 있다.
  • Wide-columns는 인터넷에 저장되는 무작위의 데이터를 다루는데 특화되었다. (ex. Cassandra, HBase)

6.3. Document Database

  • key-value 형태의 저장소와 매우 유사하다고 할 수 있는데, Document Database는 데이터를 JSON과 같은 형태의 문서로 저장한다.
  • JSON의 경우 문자열, 숫자, boolean, 배열, 오브젝트 등 다양한 형태의 데이터를 저장할 수 있다.
  • 또한 Document Database는 매우 강력한 query language를 지원한다 . 따라서, 다양한 목적의 데이터베이스를 지원할 수 있다.
  • DB-engines에 따르면, NoSQL 데이터베이스 중에서 가장 인기가 많은 걸로 MongoDB가 선정된 것 을 알 수 있다.
  • 대표적으로 MongoDB, CouchDB가 있다.

6.4. Graph Databases

  • Graph Database는 데이터를 Node와 edge의 형태로, 저장한다.
  • 매우 유연하기 때문에, 여러 시스템에 걸쳐 확장이 가능하다.
  • 소셜 네트워크, 악성 사용자의 공격 패턴 감지와 같이 여러 데이터 간의 관계도를 탐색해야 하는데 특화되었다.
  • 대표적으로 Neo4J, JanusGraph, InfoGrid, Infinite Graph.

7. NoSQL Database의 장점은?

NoSQL 데이터베이스는 유연하고, 확장성있고, 빠르다. 또한, 스키마에 구애받지 않으며, 복제가 용이하며, 단순한 API를 지원한다. 이러한 점에서, NoSQL은 종종 RDB보다 더 우수한 성능을 제공한다고 한다.

한가지 예를 들자면, 여러가지의 연관된 오브젝트를 하나의 오브젝트로 묶어야하는 경우가 발생했을 때, NoSQL의 경우, 단건 쿼리로 해결이 가능하지만, 관계형 데이터베이스의 경우 여러가지 테이블을 조인하는 등 여러가지 복잡환 쿼리를 거쳐야 한다. 때문에 관계형 데이터베이스의 경우, 개발자가 코드를 구현하는 데 더 많은 시간을 들여야하고, 성능 역시 NoSQL보다 떨어질 수 밖에 없다.

8. NoSQL Database의 단점은?

단점으로는 ACID(atomicity, consistency, isolation, durability) 트랜잭션 지원하지 않는 것이다. MongoDB의 경우 릴리즈 버번 4.0 이후로 multi-document ACID transactions를 지원하여, 위의 단점을 극복하고자 하였다.

NoSQL 데이터 모델은 데이터의 중복을 줄이는 것 보다 쿼리의 최적화에 초점을 맞추었기 때문에, 차지하는 데이터의 크기는 SQL 데이터베이스보다 더 클 수 있다.

9. 애플리케이션과 Redis DB의 커넥션의 획득하는 방법

애플리케이션과 Redis DB가 커넥션을 얻는 과정은 2가지로 요약할 수 있다.

  1. AppConfig 클래스를 통해, RedisConnectionFactory의 구현체를 사용한다. RedisConnectionFactory의 구현체는 총 2가지로 JedisConnectionFactory, LettuceConnectionFactory가 있다. 스레드 세이프를 고려하여, 주로 Lettuce를 사용한다.
  2. 디테일한 정보는 application.properties파일로 전달한다.

위 두가지를 코드로 표현하면 다음과 같을 수 있다.

@Configuration
public class AppConfig {

    //Creating Connection with Redis
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();
    }

    //Creating RedisTemplate for Entity 'Employee'
    @Bean
    public RedisTemplate<String, Employee> redisTemplate(){
        RedisTemplate<String, Employee> empTemplate = new RedisTemplate<>();
        empTemplate.setConnectionFactory(redisConnectionFactory());
        return empTemplate;
    }
}