생각정리/Redis

레디스의 기본 구조

생각중임 2024. 2. 4. 17:39

자료구조

레디스는 RDS와 달리 데이터 타입 등을 지원하지 않는다. 오직 몇 가지 로우 레벨의 데이터타입을 지원한다.

  • String : 문자열 데이터를 저장할 수 있는 가장 간단한 자료 구조
    • 최대 512MB의 문자열 데이터를 저장할 수 있으며 이진 데이터를 포함하는 모든 종류의 문자열이 binary-safe 하게 처리되기 대문에 JPEG 이미지와 같은 바이트 값, HTTP 응답값 등의 다양한 데이터를 저장하는 것도 가능하다.
    • 유일하게 키와 값이 일대일로 연결되는 자료구조이다. (String이 아닌 다른 자료 구조에서는 하나의 키에 여러 개의 값이 저장된다.)
    • 문자열에 숫자를 넣을 수 있고 원자적으로 조작을 할 수 있다. (동시성 제어와 비슷)
    • 단순 증감 연산으로 사용 가능 (INCR / INCRBY / INCRBYFLOAT / HINCRBY / HINCRBYFLAOT / ZINCRBY)

  • List : 레디스에서는 순서를 가지는 문자열의 목록으로 사용되는 자료 구조
    • 하나의 list에는 최대 42억여 개의 값을 저장할 수 있다.
    • 배열처럼 인덱스를 이용해 데이터에 직접 접근할 수도 있다. (인덱스를 사용할 때 파이선과 같이 -1로 마지막 인덱스를 사용 가능하다.)
    • 서비스에서는 스택과 큐, 덱으로 사용된다.
    • 앞뒤 데이터를 저장 및 출력은 O(1)이지만 인덱스 및 중간 데이터를 이용하면 O(n)로 처리된다.

  • Hash : 필드-값 쌍을 가진 값의 집합이다. 레디스에서 데이터가 키-값 쌍으로 저장되는 것처럼, 하나의 Hash 자료 구조 내에서 값은 필드-값 쌍으로 저장된다.
    • 필드는 하나의 Hash 내에서 유일하며, 필드와 값 모두 문자열 데이터로 저장된다.
    • Hash 내에서 필드를 추가할 수 있으며, 값마다 다른 필드를 가질 수 있어 다양한 필드를 추가할 수 있다.

  • Set : 정렬되지 않은 문자열의 모음
    • 값은 중복을 허용하지 않는다.
    • 교집합, 합집합, 차집합 등의 집합 연산과 관련한 커맨드를 제공해 객체 간의 관계를 계산하거나 유일한 원소를 구해야 할 경우에 사용될 수 있다.

  • sorted Set : score값에 따라 정렬되는 고유한 문자열의 집합
    • 저장될 때부터 스코어 값으로 정렬돼 저장된다.
    • 같은 스코어를 가진 값은 데이터의 사전 순으로 정렬돼 저장된다.
    • 조회시 항상 범위를 정해주어야 한다. (인덱스, 값의 키, 값의 값)
    • 입력한 문자열을 포함하려면 (, 포함하지 않으려면 [를 사용한다.
레디스에서 인덱스를 이용해 데이터를 접하는 속도는 list가 O(n)로 sorted set가 O(log n)으로 좀 더 빠르다.

  • Bitmap : 독자적인 자료 구조는 아니며 string 자료 구조에 bit 연산을 수행할 수 있도록 확장한 형태
    • string 자료 구조가 binary safe 하고 최대 512MB의 값을 저장할 수 있다.
    • 다른 구조에 비해 저장 공간을 획기적으로 줄일 수 있다.

  • Hypperloglog : 집합의 원소 개수인 카디널리티를 추정할 수 있는 자료 구조
    • 비트 패턴을 분석하여 비교적 정확한 추정 값(오차 0.81%)을 계산할 수 있다.
    • 대량 데이터에서 중복되지 않는 고유한 값을 집계할 때 유용하게 사용
  • Geospatial : 경도, 위도 데이터 쌍의 집합으로 간편하게 지리 데이터를 저장할 수 있는 자료구조
    • 내부적으로 데이터는 sorted set으로 저장되며, 하나의 자료 구조 안에 키는 중복돼 저장되지 않는다.
  • Stream : 레디스 5.0 버전부터 제공하는 메시지 브로커로서 사용할 수 있게 하는 자료 구조
    • 카프카에서 영향을 받아 만들어졌으며, 소비자 그룹 개념을 도입해 데이터를 분산 처리할 수 있는 시스템
    • 데이터는 계속 추가하는 방식(append-only)으로 저장한다.
    • 실시간 이벤트, 로그성 데이터, 메시지 서비스 등으로 이용할 수 있다.
레디스의 기본적인 자료구조들을 홛인해봤는데, 컬렉션의 형태의 자료 구조와 동일한 부분들도 있지만 다르게 사용되는 부분들도 있어 그런 점을 유의해서 사용을 해야겠다.
그래도 인덱스를 파이썬과 같이 사용할 수 있어 활용점이 아주 높아 좋아보인다.
신규로 도입된 스트림도 카프카와 비교를 해보면서 사용해 보면 배울 점이 많을 것 같다.