[Redis] Redis의 자료 형식과 기능(List, Set) - 2.2

이전 글 Redis의 String형식에 이어서 이번에는 List와 Set형식에 대해 알아보고 실습해보겠습니다.

Redis의 LIST 실습

1. Lists 특징

  • 지정한 Key에 리스트를 저장할 수 있습니다.
  • 왼쪽(Left)이 Head, 오른쪽(Right)이 Tail입니다.
  • 리스트에 들어갈 수 있는 최대 갯수는 2^32 - 1 (4,294,967,295)개 입니다.
  • Stack, Queue 등을 구현하는데 사용합니다.

2. Comands

  • LPUSH 새 원소를 Head에 추가한다.
  • RPUSH 새 원소를 Tail에 추가한다.
  • LPOP Head의 원소를 지우고 리턴한다.
  • RPOP Tail의 원소를 지우고 리턴한다.
  • LRANGE 특정 길이, 개수 만큼 원소를 리턴한다. (ex. 리스트의 처음부터 마지막 까지의 원소를 반환 - LRANGE mylist 0 -1)
  • LLEN 리스트의 길이를 리턴한다.
  • LREM  특정 원소를 찾아서 지운다.
  • LMOVE atomic하게 한 리스트의 원소들을 다른 리스트로 옮긴다.
    • Reliable Queue를 구현하는데 사용할 수 있다. (LMOVE, LREM 이용)
      1. Que 2개 job / processing
      2. job에서 LMOVE로 작업할 원소를 processing que로 이동
      3. processing que에 있는 작업이 실패 시 processing que에 남음 / 성공 시 processing que원소 삭제 (LREM 사용)
    • Circular List를 만들 수 있다. (source, destination을 같은 리스트로)
  • LTRIM 지정한 range 만큼의 원소들을 남기고 나머지를 지운다.
    • -1 은 마지막 원소를 뜻한다.
    • 주의: 지우는 대상이 많을 수록 시간이 오래걸린다. O(N)
  • BLPOP
    • LPOP과 같다. 만약 리스트가 비어있다면 새로운 원소가 들어올 때까지 기다린다. (blocking) 단, timeout발생 이전까지 기다린다.
  • BLMOVE
    • LMOVE와 같다. source의 리스트가 비어있다면 새로운 원소가 들어올 때까지 기다린다.

3. 실습

  • Head에 원소 삽입
    LPUSH mylist value

  • Tail에 원소 삽입
    RPUSH mylist value

  • Head / Tail 원소 제거
    LPOP mylist
    RPOP mylist

  • 리스트원소를 다른 리스트에 옮기기 (왼쪽에 있는 원소를 다른 리스트의 왼쪽에 삽입)
    LMOVE mylist tolist LEFT LEFT

  • 특정 원소만 남기고 지우기 (왼쪽 5개의 원소만 남기고 모두 지우기)
    LTRIM templist 0 4

Redis의 Set 실습

1. Set의 특징

  • 정렬되지 않은 unique string데이터(member)에 대한 집합을 저장할 때 씁니다.
  • 대부분 command의 시간복잡도가 O(1)이지만, 그렇지 않은 command의 경우 주의해서 사용해야합니다.
  • 하나의 Set에 들어갈 수 있는 member의 사이즈는 최대 2^32-1 (4,294,967,295)입니다.
    • 10만개 이하로 관리하는 것이 defacto guide입니다.
  • 유일한 원소를 저장/조회할 때 씁니다.
  • 관계를 표현할 때 씁니다.
  • 교집합, 합집합, 차집합 등의 operation을 하고 싶을 때 씁니다.

2. Commands

  • SADD Set 에 새로운 member를 추가한다.
  • SREM Set 에서 특정 member를 삭제한다.
  • SMEMBERS Set에 저장된 모든 member를 리턴한다.
    • O(N)의 시간복잡도를 가지고, memeber가 많은 경우 레디스에 부하를 주거나 다른 commands를 느리게할 수 있으므로 주해야한다. SMEMBERS보다는 SSCAN을 통해서 부분조회하는 것을 권장한다.
  • SISMEMBER 주어진 String이 Set에 존재하는지 확인한다.
    • SMEMBERS 와 마찬가지로 O(N)의 시간복잡도를 가진다.
  • SINTER 주어진 두 개 이상의 Set에 모두 존재하는 member들을 리턴한다. (교집합)
    • worst case O(N*M) - N은 cardinality, M은 비교대상이 되는 Set의 갯수
  • SCARD Set의 size(cardinality)를 조회한다.

3. 실습

  • Set에 member 추가

  • member삭제

  • 주어진 String이 Set에 존재하는지 확인
    SISMEMBER key1 two

  • 교집합
    SINTER key1 key2