004 Lettuce

2. Lettuce #

구조 #

  • Reactor 기반으로 Reactive API 지원
    • Reactive streams API 지원
    • 동기 API, 비동기 API 모두 지원
  • Netty 기반으로 높은 성능과 확장성 제공
    • 일반 TCP 통신 뿐만 아니라 epoll, kqueue 기반의 multiplexing I/O 지원 img.png

주요 컴포넌트 #

  • RedisClient : Redis의 연결 정보를 포함하는 객체
    • Netty의 Channel, EventLoopGroup 등을 포함하기 때문에 가능한한 재사용
    • RedisConnecction 생성
  • StatefulRedisConnection : Redis 서버 Connection
    • 여러 쓰레드가 동시에 접근해도 안전
    • 동기, 비동기, Reactive command를 제공
  • RedisReactiveCommand : Redis API와 관련된 reactive command 제공 img_1.png

RedisReactiveCommand 획득 #

  • RedisClient.create : Redis Client를 생성
    • RedisURI builder를 통해서 host, port 주입
    • 연결 정보를 String으로 전달하여 생성 가능
  • RedisCleint의 connect를 통해서 StatefulRedisConnetion 획득
  • StatefulRedisConnection의 reactive를 통해서 reactiveCommand 획득 img_2.png

RedisReactiveCommand 실행 #

  • StatefulRedisConnection과 ReactiveCommand는 key-value로 String 지원
  • set command를 실행한 후, then으로 get command 실행 img_3.png

StatefulRedisConnection #

  • sync, async, reactive command 지원
  • addListener를 통해서 RedisPubSubListener나 RedisConnectionStateListener 등을 등록, 삭제 가능 img_4.png

Redis(Async)Commands #

  • RedisCommands는 모든 commands를 동기 방식으로 수행
  • RedisAsyncCommands는 모든 commands를 RedisFuture 형태로 반환 img_5.png

RedisFuture #

  • CompletableFuture와 비슷하게 CompletionStage와 Future를 구현
  • 추가로 에러를 조회할 수 있는 getError와 특정 시간동안 응답을 기다리는 await 제공 img_6.png

RedisReactiveCommands #

  • RedisReactiveCommands는 여러 타입의 Commands를 상속
  • 각각의 Redis가 지원하는 데이터 타입과 맵핑
    • String
    • List
    • Set
    • Hash
    • SortedSet
    • Stream
    • HLL (HyperLogLog) img_7.png

String #

  • set을 통해서 person:1:name, pserson:1:age를 설정
  • setnx를 통해서 값을 바꾸려고 하지만, 이미 key에 value가 존재하면 반영X
  • get, mget을 통해서 value에 접근
    • mget은 KeyValue를 반환
  • incrby를 톨해서 key의 값을 증가 img_8.png

List - queue #

  • lpush를 통해서 값들을 추가
  • llen을 이용해서 길이를 파악
  • rpop을 하면 가장 처음에 들어간 item이 pop되기 때문에 queue를 구현 가능 img_9.png img_10.png

List - stack #

  • lpush를 통해서 값들을 추가
  • llen을 이용해서 길이를 파악
  • lpop을 하면 가장 마지막에 들어간 item이 pop되기 때문에 stack을 구현 가능 img_11.png img_12.png

Set #

  • sadd를 통해서 추가, 결과로 추가된 갯수 반환
  • set은 값이 unique하기 때문에 이미 존재하는 item에 대해서는 무시
  • scard : set의 cardinality 반환
  • smembers : 모든 item 조회
  • sismember : redis에 item이 포함되는지 확인
  • srem으로 item 삭제 img_13.png img_14.png

Hash #

  • hest에 map을 제공하여 여러 field를 한번에 추가
  • hgetall : 모든 필드에 접근하여 flux로 반환
  • hlen : hahs의 크기 조회
  • hincrby : age 필드의 크기를 10만큼 증가
  • hmget : 여러 필드에 대한 값 조회
  • hdel : age 필드 제거 img_15.png img_16.png

SortedSet #

  • zadd : score와 value 추가
  • zrem : value를 삭제
  • zcard : sortedSet의 cardinality 조회
  • zrangeWithScores : 특정 범위의 값들을 score와 함께 조회
  • zrank : 특정 value의 rank를 조회 img_17.png img_18.png

TTL #

  • expire : key에 ttl을 부여
  • ttl command : key에 남은 ttl 확인
  • ttl이 지난 후 key에 조회시 empty
  • key가 존재하지 않기 때문에 -2를 반환 img_19.png img_20.png

TTL - persist #

  • expire : key에 ttl을 부여 후
  • persist : key를 영구 보관 가능
  • key에 ttl이 없는 경우 -1을 반환 img_21.png

PubSub #

  • StatefulRedisPubSubConnection과 RedisPubSubReactiveCommand를 이용
    • channel을 subscribe하고 observe 가능
  • 다른 StatefulRedisConnection을 만들어서 channel에 publish img_22.png img_23.png

Stream #

  • 특정 stream의 최신 메세지를 읽기 위해 대기

  • xread : count만큼의 stream을 받은 후 complete

  • 지속적으로 listen하기 위해서는 repeat 등을 활용 가능

    • complete 이후 다시 subscribe
  • xread : block 인자로 받은 시간만큼 connection을 blocking img_24.png

  • 두 번째 connection을 만들고 redis transaction을 이용해서 여러 stream을 xadd로 추가 img_25.png img_26.png

HyperLogLog #

  • pfadd : key에 value들을 추가
  • pfcount : key의 크기를 추정
    • hyperloglog는 적은 메모리로 집합의 원소 개수를 추정 가능
  • key를 아티클의 id, value를 유저의 id로 둔다면 매우 적은 메모리로 unique view count를 구할 수 있다.

  1. 강의 : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지_