알아두면 좋은것

Redis 의 기본 지식

큼큼이 2020. 3. 31. 22:20

Redis 를 제대로 공부하고 사용하고 있을까?

-> 당연히 아니다!^^ 레디스를 단지 캐싱 용도로 사용하고 사용하지 어떻게 구성되어 있는지...

어디서 가지고 오는지 전혀 모르고 그냥 get 하면 어디선가 알아서 가지고 오는구나~! 하고 말았지ㅋ

공부해보니까 무궁무진에 너무 새롭다....^^;;;;

 

Redis

- key-value 구조의 데이터 관리 시스템이다.

모든 데이터를 메모리에 저장하고 조회하기 때문에 빠른 속도를 보장하는 NoSQL 이다.

메모리 접근이 디스크 접근 방식 보다 빠르기 때문에 속도가 빠르다.

 

1. 레디스 클러스터 구조

- Redis Cluster 기능은 Redis 3.0 에서부터 추가 된 기능이다.

- 여러 개의 노드 간의 데이터가 자동으로 처리되는 방법을 제공한다.

  • 샤딩을 통해 데이터를 분산해서 저장한다.
  • 0~16383 의 데이터 슬롯을 각 노드들에 일정하게 할당해서 해시 함수를 통해 슬롯에 저장된다.
    • 각 노드들에 슬롯이 할당된다.
    • 어떤노드에 저장 될 지는 cluster keyslot {key} 명령어를 사용하면 몇 번 슬롯에 저장 될 지를 알 수 있다.
    • set {key} {data} 를 통해 값을 저장 할 때, 어떤 노드에서 set 을 하더라도 맞는 노드로 Redirected 되어 set 된다.
    • get {key} 도 마찬가지로 맞는 노드로 Redirect 되어 get 해온다.

 

2. FailOver : 클러스터 구조에서 Master 가 죽는다면 어떻게 될 것 인가?

- FailOver 야 말로 클러스터 구조를 사용하는 이유라고 볼 수 있다.

  • 데이터가 샤딩되어 저장되어 있기 때문에 한 Master 노드가 죽는다고 하더라도 모든 데이터가 날라가는 것이 아니고 일부 데이터의 손실이 있다. 
    • 각 Master 들은 Slave 를 가지기 때문에 Fail 된다고 하더라도 Slave 가 Master 가 되며 FailOver 할 수 있게 된다.

 

3. Redis Client Library

- Redisson

- Jedis

- Lettuce

 

각 레디스 클라이언트들은 지원하는 기능이나 방식 등이 다르다.

 

Jedis : ReadFromSlave 를 지원하지 않는다.

-> 이 것을 이번에 알게되었다!^^ 그럼 Slave 는 펑펑 놀고 있을 거고. slave 는 단지 master 의 failover 로만 사용하는 용도 인 것 같다.

 

Redisson : ReadMode
SLAVE - slave 가 사용 불가할 때만 master 에서 읽어오고 slave 에서만 읽어온다.
MASTER - master 에서 읽어온다.
MASTER_SLAVE - 두 노드 상관 없이 읽어온다.

 

Lettuce : ReadFrom
MASTER - Default 값. master 에서 읽어 옴
MASTER_PREFERRED - master 에서 읽지만 사용 할 수 없는 경우에만 Slave 에서 읽음
SLAVE - Slave 에서만 읽음
SLAVE_PREFERRED - Slave 에서 읽고 불가능 할 때 master 에서 읽음
NEAREST - 가까운 노드에서 읽도록 설정

 

RedisConfiguration 을 만들 때, readFrom 을 설정 할 수 있고

그 예로

LettuceClientConfiguration config 
= LettuceClientConfiguration
.builder()
.readFrom(SLAVE_PREFERRED)
.commandTimeOut(Duration.ofMinutes(1))
.shutdownTimeout(Duration.ZERO)
.build();

이렇게 config 를 만들면 된다.

 

 

출처 : Redis Document (https://redis.io/);

Lettuce github (https://github.com/lettuce-io/lettuce-core);

Lettuce Document(https://lettuce.io/lettuce-4/release/api/com/lambdaworks/redis/ReadFrom.html)

Spring docs (https://docs.spring.io/)