728x90

Backend/Redis 6

Redis Cluster 동작방식

클러스터 구동시 노드별로 데이터를 저장할 수 있는 hashslot을 할당받게 된다. 그리고 데이터 저장시 Redis 자체 해시 알고리즘에 의해 key에 맞는 hashslot이 선택되어 저장된다. 데이터를 읽을 때에는 역시 자체 해시 알고리즘에 의해 key 에 맞는 hashslot에서 데이터를 읽게 된다. 즉, 특정 키는 특정노드에만 저장된다. 그런데 어쨋든 클라이언트 입장에서는 이러한 Read/Write 는 를 수행하려면 특정 노드에 일단 연결이 되어야 한다. 예를 들어 1~3 까지의 노드가 있고 A key에 해당하는 hashslot이 3노드에 할당된 상태라고 가정해보자. 그런데 클라이언트가 1번 노드에 연결되어 A key를 Read/Write 하려고 하면 어떻게 될까? 이때는 3번 노드로 Redirec..

Backend/Redis 2021.04.28

redis 옵션 정리

daemonize redis 데몬을 백그라운드로 실행할지 여부를 지정한다. 기본값 no 로 이 경우 포그라운드로 실행된다. 이 경우 Ctrl+C를 하면 레디스 서버가 종료된다. 백그라운드로 실행시키고 싶다면 해당 옵션을 yes로 설정해야 한다. 해당 옵션의 기본값은 no 이다. appendonly Redis 는 in memory DB이기 때문에 서버가 비정상 종료시 기본적으로 데이터가 모두 날라간다. 이를 위해 redis 서버에 데이터가 입력/수정/삭제될 때 마다 해당 데이터를 디스크에 쓰는 기능을 제공하는데 appendonly 가 바로 그 설정이다. 이 값을 yes 로 지정할 경우 특정 파일에 데이터를 기록하게 되고 추후 redis 서버 시작시 읽어들어 메모리에 저장된다. 해당 옵션의 기본값은 no 이..

Backend/Redis 2021.04.27

Redis 구성 방법

Redis 는 Single instance, Sentinel, Cluster 방식 중 하나를 선택적으로 구성할 수 있다. Single instance 는 단일구성을 의미하는 것으로 굳이 정리가 필요없을 것 같고 Sentinel, Cluster 방식에 대해 정리해 보고자 한다. Sentinel 센터널 방식은 우리가 흔히 접할 수 있는 Master/Slave 구조이다. Write는 Master로만 진행하고 Read는 Slave로만 진행한다. 그리고 Master에 Write된 Data는 Slave로 Replication 된다. 일반적으로 Master 1대와 Slave 2~3대 정도로 운영하는 것 같다. 이런 구조에서는 Master 가 죽어버리면 Write를 할 수 없게 되기 때문에 Slave 중 하나가 임시로..

Backend/Redis 2021.04.27

Redis 커넥션 풀

SpringBoot 기반 Redis 예제를 서칭하다보면 application.yml 에 아래와 같이 구성정보를 설정하는 경우를 볼 수 있다. spring: redis: host: localhost port: 6379 lettuce: pool: max-active: 10 max-idle: 10 min-idle: 2 그런데 lettuce.pool 설정은 사실 의미없는 설정이다. Redis 자체는 싱글스레드 기반이기 때문에 여러 커넥션을 사용한다고 해도 성능이 좋아지지 않기 때문이다. 공식 문서를 보면 Redis 커넥션 풀링은 트랜잭션을 사용할때만 제한적으로 사용된다고 되어 있다. 참고 lettuce.io/core/release/reference/index.html#connection-pooling.is-co..

Backend/Redis 2021.04.15

Redis null 값 캐싱하지 않기

value 가 null 일 경우 굳이 캐싱할 필요가 없기 때문에 RedisCacheManager 선언시 아래와 같이 disableCachingNullValues() 를 포함하곤 한다. 그런데 실제로 @Cacheable 를 선언한 메소드에서 null을 리턴하는 순간 아래와 같은 에러를 마주할 수 있었다. Avoid storing null via '@Cacheable(unless="#result == null")' or configure RedisCache to allow 'null' via RedisCacheConfiguration. 결국 @Cacheable 어노테이션에 unless = "#result == null" 속성을 추가하라는 말인데 나는 분명 전역적으로 null 을 캐싱하지 않겠다고 했는데 왜 ..

Backend/Redis 2021.04.15
728x90