Redis

mjjin·2023년 9월 22일
0

Redis

  • in-memory 방식의 No-SQL 기반 DBMS
  • Key-Value(키-값) 구조의 데이터를 저장, 관리
  • Singel-Thread 기반으로 동작함.(명령 수행)
  • DB, Cache(캐시),Message Broker(메시지브로커) 용도로 주로 사용함.
    • 사용예시) 세션관리, 대기열, 실시간 순위표, 캐시

In-memory (인메모리 저장소)

  • MySQL, PostgreSQL, Oracle 과 같은 DBMS에서는 디스크 또는 SSD 와 같은 저장소에 저장하지만,

Redis는 in-memory 방식으로 인해, 서버의 주 메모리에 저장된다.

필요한 데이터를 빠르게 조회, 처리 할 수 있다. (서버 메모리에 데이터가 적재되기 때문.)

in-memory 방식이지만, 스냅샷을 통해 디스크에 백업 하는 기능이 있다.

기존의 WAS-DB 구조를 사용한다고 했을때, 사용자가 많아져 DB로의 요청이 많아진다면, DB에 부하가 걸리게 된다.

Redis는 이럴 때 캐시 서버로서 이용 하게 된다. (요청 데이터를 얻기위해 DB에 접근하지 않아 된다.)


Redis 특징 및 장단점

  • 초당 10만 ~ 15만건 정도의 명령 수행 가능.
    • 공식문서상: 리눅스 시스템에서 파이프링(pipelining)을 통해 초당 100만건 요청 수행가능
  • 영속성을 지원하는 In-memory 데이터 저장소
    • 메모리를 활용하면서도 데이터의 영속적인 보존(Persistence)스냅샷 기능을 제공하여 메모리 내용을 *.rdb 파일로 저장하여, 해당 시점으로 데이터 복구 가능.
    • 명령어로 명시적 삭제, expires를 설정하지 않으면 데이터가 삭제되지 않는다.
  • 1개의 Thread 사용 (Single Thread)
    - 서버 하나에 여러개의 Redis Server 실행 가능 -> Master-slave 구조 개념
    하나의 트랜잭션당 하나의 명령만 수행함.
    List타입의 데이터 처리가 MySQL에 비해 10배 정도 빠름.
    - 서버 복제 지원 -> master-slave
    장애 발생 대비, 읽기 성능 증대를 위해 slave가 master에 연결되어
    master 데이터를 slave 에 복제를 지원한다.
- master에 쓰기가 수행된다면, slave로의 데이터 전송이 실시간으로 이루어진다.
  • 단점 : 인메모리 방식이기 때문에, 장애 발생시 데이터 유실의 위험이 있음. 따라서 스냅샷, AOF 기능을 통한 복구 및 백업을 통해 데이터 유실에 대비해야함

Redis 용어

  • AOF - Append Only File
- 모든 쓰기 명령에 대한 로그를 남기고 저장한다.서버가 재시작 할 시 write/update 를 순차적으로 재실행, 데이터를 복구한다.
- COW - Copy On Writeredis가 데이터를 쓰기위해 사용하는 메커니즘
- RSS - Resident Set Size  

데이터를 포함한, redis가 실제로 사용하고 있는 메모리.
해당 값은 실제로 사용하고 있는 메모리 값보다 클 수 있다.

  • 이외에도 Redis 를 더 효율적으로 사용하기 위한 개념들이 존재한다.

  • Redis Replication: master-Replica (단순한 비동기식 복제, master를 그대로 Replica로 복제{replicaof 커맨드로 연결})

  • Redis Cluster: 분산처리 -> 데이터가 여러 마스터에 분할 저장되는 샤딩 기능제공, 모든 노드가 서로 감시, 마스터3대 이상필요

  • Redis Sentinel: 장애 복구 시스템 -> 센티널 노드가 다른 노드 감시, 마스터가 비정상일때 자동으로 페일오버함.

  • Redis Topology

  • Redis Sharding

  • Redis Failover


Redis 지원 데이터 타입(형식)

  1. String: 일반적인 Key-value 형태
  2. Hash: 하나의 key에 여러개의 value를 저장할 때 사용함.
  3. List: Array 형식의 데이터 구조, 처음과 끝 데이터를 넣고 뺴는 것은 빠르지만, 중간 데이터는 성능이 떨어진다.
  4. Set: String의 집합체, 중복을 허용하지 않는다.
  5. Sorted Set: 중복된 데이터를 허용하지않는 Set구조에 정렬(Sort)를 적용한 구조.
  6. Bitmaps: 실제 데이터유형이 아닌, 문자열 유형에 정의된 비트 지향 연산의 집합
  7. streams

Spring Boot - Redis 설정

  • Spring boot 에서 Redis를 사용하는 방법은 RedisRepository, RedisTemplate 2가지 방식이 존재한다.

  • Java에서 Redis 를 사용하기 위한 Client에는 2가지가 존재한다.

  1. Lettuce
  2. Jedis

Jedis 를 주로 사용했었지만, 최근에는 Lettuce를 사용한다.

  • Jedis : 단점(멀티 스레드 환경 불안정, Pool 한계 등등)
  • Lettuce : 사용이유(Netty 기반 환경이라 비동기 지원, Jedis 보다 빠른 속도, 안정성)

RedisConfig - 공통 설정 파일

  • redis를 스프링부트에서 사용하기 위해서는 아래의 공통 파일을 생성 해주어야 한다.

  @Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        template.setValueSerializer(new GenericToStringSerializer<>(Object.class));
        return template;
    }

    @Bean
    public RedisMessageListenerContainer redisContainer(RedisConnectionFactory factory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(factory);
        return container;
    }
}

0개의 댓글