Open Hae-Riri opened 3 years ago
Redis를 마치 JPA repository를 쓰듯 사용하도록 인터페이스를 제공하는 스프링 모듈
key-value 구조의 비정형 데이터를 저장, 관리하기 위한 비관계형 데이터베이스 관리 시스템으로, Memcached와 자주 비교되는 메모리 기반 저장소다.
Memcached에서는 collection을 제공하지 않지만 Redis는 제공한다. Collection이 왜 중요할까?
결국, 외부 Collection을 잘 이용하는 것으로 여러가지 개발 시간을 단축시키고 문제를 줄여줄 수 있어서 중요하다.
컬렉션의 종류는 아래에 적었다.
reactive redis는 spring-data-redis 에 통합되어있지 않고 별도로 spring-boot-starter-data-redis-reactive를 추가해야 한다. junit 테스트도 처리할 수 없어서 별도로 io.projectreactor:reactor-test도 추가해야 한다.
leftPushAll로 한번에 데이터를 저장하면 문제 없지만 leftPush를 통해 단건으로 여러번 입력할 경우, 저장되는 순서가 뒤바뀔 수도 있다. 순서가 중요하다면 List에 데이터를 저장할 때 reactive 사용을 주의해야 한다.
SortedSet의 score는 double 타입이기 때문에 값이 정확하지 않을 수 있다. 컴퓨터에서는 실수가 표현할 수 없는 정수값들이 존재하니까. Long 정수형 말고 string으로 보내야 함.
간단한 sql 문을 대체한다면? with 정렬
아주 추상적으로 웹 서비스 구조를 생각하면 [client - web server - db]가 되는데, db안에는 많은 데이터가 있고 이때 주로 디스크에 내용이 저장되게 된다. 사실 DB도 내부에 자기만의 캐시가 있긴 한데, 여러 접근이 생기면 기존 캐시를 없애고 디스크에서 새로 읽어와야 한다. 이때 디스크 접근을 할 때마다 속도가 느려질 수 있다.
예전부터 쓰여 온 java 표준 redis client
SpringBoot2.0부터 기본 client다. (지금 user-api 는 spring boot 2.3이다. fully non-blocking redis client built with netty providing 리액티브, 비동기와 동기 데이터 접근
rpc get (Empty) returns (UserResponse) {}
message Empty{
NaverUser headers = 1;
}
Spring Data Redis
Spring Data에서 지원하는 key-value 저장소로, 휘발성 멤캐시디(범용 분산 캐시 시스템)와 비슷하다.
1. Pub/Sub
1.1 (HTTP) Request / Response vs Messaging
일반적인 시스템 통합 방법으로는 아래 방법들이 있다.
1.2 Messaging Pub/Sub vs Message Queuing
메시징은 포괄적인 단어이고, '메시징'을 구현하는 방법은 매우 다양하다. 그 방법들 중 Pub/Sub와 메시지 큐잉을 구분하자.
메시지 큐잉
메시지 큐잉 은 오직 한 수신자만 메시지를 수신한다. 주문을 처리하는 클라이언트가 있다면 3건의 주문을 순차적으로 받아서 처리한다.
이때, 너무 처리시간이 느려서 채널에 메시지가 쌓일 수 있는데 그러면 심각한 병목 현상이 발생한다. 이를 해결하기 위해, 메시지들을 처리할 수 있는 클라이언트를 늘려주면 동시에 여러 메시지를 처리할 수 있다.
클라이언트는 독립된 환경에서 실행되기 때문에 각각 '경쟁 소비자'가 되어서 각 메시지에 대한 처리 순서가 보장되지는 않는다. 만약 주문1이 잘 처리가 안된다면 서버는 다시 주문1을 보내게 되고, 이 이벤트는 주문2, 주문3 이후에 처리가 될 수도 있다. 따라서 이벤트에 대한 순서를 보장할 필요가 있다.
Pub/Sub
메시지 큐잉과 달리 수신자(클라이언트) 모두에게 동일한 메시지를 전송한다.
1.3 Redis Pub/Sub
Redis Pub/Sub는 매우 심플한 Pub/Sub 기능을 제공하는데 Redis에서는 Pub/Sub 메시지를 별도로 저장하지 않고, 메시지를 한번 보내면 끝난다. 즉, 메시지 지속성이 없다. 메시지를 전송한 후 해당 메시지가 삭제되는데 Redis 어디에도 저장되지 않는다.
2. Redis Pub/Sub
2.1 Redis
Redis란 다음 특징을 갖는 data structure 다.
2.2 Redis Pub/Sub
Java의 Redis Client
Lettuce
스프링에서 이걸 왜 선호할까?
여러 스레드에서 단일 jedis 인스턴스를 공유하려 할 때