2. Lettuce #
구조 #
- Reactor 기반으로 Reactive API 지원
- Reactive streams API 지원
- 동기 API, 비동기 API 모두 지원
- Netty 기반으로 높은 성능과 확장성 제공
- 일반 TCP 통신 뿐만 아니라 epoll, kqueue 기반의 multiplexing I/O 지원
주요 컴포넌트 #
- RedisClient : Redis의 연결 정보를 포함하는 객체
- Netty의 Channel, EventLoopGroup 등을 포함하기 때문에 가능한한 재사용
- RedisConnecction 생성
- StatefulRedisConnection : Redis 서버 Connection
- 여러 쓰레드가 동시에 접근해도 안전
- 동기, 비동기, Reactive command를 제공
- RedisReactiveCommand : Redis API와 관련된 reactive command 제공
RedisReactiveCommand 획득 #
- RedisClient.create : Redis Client를 생성
- RedisURI builder를 통해서 host, port 주입
- 연결 정보를 String으로 전달하여 생성 가능
- RedisCleint의 connect를 통해서 StatefulRedisConnetion 획득
- StatefulRedisConnection의 reactive를 통해서 reactiveCommand 획득
RedisReactiveCommand 실행 #
- StatefulRedisConnection과 ReactiveCommand는 key-value로 String 지원
- set command를 실행한 후, then으로 get command 실행
StatefulRedisConnection #
- sync, async, reactive command 지원
- addListener를 통해서 RedisPubSubListener나 RedisConnectionStateListener 등을 등록, 삭제 가능
Redis(Async)Commands #
- RedisCommands는 모든 commands를 동기 방식으로 수행
- RedisAsyncCommands는 모든 commands를 RedisFuture 형태로 반환
RedisFuture #
- CompletableFuture와 비슷하게 CompletionStage와 Future를 구현
- 추가로 에러를 조회할 수 있는 getError와 특정 시간동안 응답을 기다리는 await 제공
RedisReactiveCommands #
- RedisReactiveCommands는 여러 타입의 Commands를 상속
- 각각의 Redis가 지원하는 데이터 타입과 맵핑
- String
- List
- Set
- Hash
- SortedSet
- Stream
- HLL (HyperLogLog)
String #
- set을 통해서 person:1:name, pserson:1:age를 설정
- setnx를 통해서 값을 바꾸려고 하지만, 이미 key에 value가 존재하면 반영X
- get, mget을 통해서 value에 접근
- mget은 KeyValue를 반환
- incrby를 톨해서 key의 값을 증가
List - queue #
- lpush를 통해서 값들을 추가
- llen을 이용해서 길이를 파악
- rpop을 하면 가장 처음에 들어간 item이 pop되기 때문에 queue를 구현 가능
List - stack #
- lpush를 통해서 값들을 추가
- llen을 이용해서 길이를 파악
- lpop을 하면 가장 마지막에 들어간 item이 pop되기 때문에 stack을 구현 가능
Set #
- sadd를 통해서 추가, 결과로 추가된 갯수 반환
- set은 값이 unique하기 때문에 이미 존재하는 item에 대해서는 무시
- scard : set의 cardinality 반환
- smembers : 모든 item 조회
- sismember : redis에 item이 포함되는지 확인
- srem으로 item 삭제
Hash #
- hest에 map을 제공하여 여러 field를 한번에 추가
- hgetall : 모든 필드에 접근하여 flux로 반환
- hlen : hahs의 크기 조회
- hincrby : age 필드의 크기를 10만큼 증가
- hmget : 여러 필드에 대한 값 조회
- hdel : age 필드 제거
SortedSet #
- zadd : score와 value 추가
- zrem : value를 삭제
- zcard : sortedSet의 cardinality 조회
- zrangeWithScores : 특정 범위의 값들을 score와 함께 조회
- zrank : 특정 value의 rank를 조회
TTL #
- expire : key에 ttl을 부여
- ttl command : key에 남은 ttl 확인
- ttl이 지난 후 key에 조회시 empty
- key가 존재하지 않기 때문에 -2를 반환
TTL - persist #
- expire : key에 ttl을 부여 후
- persist : key를 영구 보관 가능
- key에 ttl이 없는 경우 -1을 반환
PubSub #
- StatefulRedisPubSubConnection과 RedisPubSubReactiveCommand를 이용
- channel을 subscribe하고 observe 가능
- 다른 StatefulRedisConnection을 만들어서 channel에 publish
Stream #
-
특정 stream의 최신 메세지를 읽기 위해 대기
-
xread : count만큼의 stream을 받은 후 complete
-
지속적으로 listen하기 위해서는 repeat 등을 활용 가능
- complete 이후 다시 subscribe
-
xread : block 인자로 받은 시간만큼 connection을 blocking
-
두 번째 connection을 만들고 redis transaction을 이용해서 여러 stream을 xadd로 추가
HyperLogLog #
- pfadd : key에 value들을 추가
- pfcount : key의 크기를 추정
- hyperloglog는 적은 메모리로 집합의 원소 개수를 추정 가능
- key를 아티클의 id, value를 유저의 id로 둔다면 매우 적은 메모리로 unique view count를 구할 수 있다.
- 강의 : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지_