Server/Redis

Redis data types

metamong-data 2024. 9. 10. 16:08
728x90
반응형

개요

redis에 있는 data에 type들을 알아보고자 한다.

핵심 데이터 유형

Redis Community Edition에서는 아래와 같은 데이터 유형을 구현하고 있다.

Redis Stack 과 Redis Enterprise에는 JSON과 같은 다른 유용한 유형을 구현하는 확장 모듈 도 포함되어 있다.

Strings

Redis 문자열 은 가장 기본적인 Redis 데이터 유형으로, bytes 시퀀스를 나타낸다.

  • Redis String 설명Redis의 Key는 문자열이므로 문자열 유형을 값으로 사용할 때도 문자열을 다른 문자열에 매핑하며, 문자열 데이터 유형은 HTML 조각이나 페이지를 캐싱하는 것과 같은 여러 사용 사례에 유용하다.보시다시피 SET및 GET명령을 사용하는 것은 문자열 값을 설정하고 검색하는 방법입니다. SET키가 이미 존재하는 경우 키가 문자열이 아닌 값과 연결되어 있더라도 키에 이미 저장된 기존 값을 대체합니다. 따라서 SET할당을 수행합니다.SET 명령에는 추가 인수로 제공되는 흥미로운 옵션이 있습니다. 예를 들어, 키가 이미 존재하면 SET에 실패하도록 요청하거나, 반대로 키가 이미 존재하는 경우에만 성공하도록 요청할 수 있습니다.문자열에서 작동하기 위한 다른 명령이 많이 있습니다. 예를 들어, GETSET이 명령은 키를 새 값으로 설정하고 이전 값을 결과로 반환하는 기능이며,  INCR 은 웹사이트가 새 방문자를 받을 때마다 Redis 키를 증가 시키는 시스템이 있는 경우 이 명령을 사용할 수 있으며, 한 번의 증가도 잃지 않고 매 시간 한 번씩 이 정보를 수집하고 싶을 수 있으며,  GETSET키를 사용하여 새 값인 "0"을 할당하고 이전 값을 다시 읽을 수 있다.
    > mset bike:1 "Deimos" bike:2 "Ares" bike:3 "Vanth"
    OK
    > mget bike:1 bike:2 bike:3
    1) "Deimos"
    2) "Ares"
    3) "Vanth"
    
    문자열을 이용한 카운터
    > set total_crashes 0
    OK
    > incr total_crashes
    (integer) 1
    > incrby total_crashes 10
    (integer) 11
    
    INCR은 독립적으로 동작하며, 동일한 키에 대해 INCR을 발행하는 여러 클라이언트가 경쟁 조건에 들어가지 않는다는 뜻이며, 예를 들어, 클라이언트 1이 "10"을 읽고, 클라이언트 2가 동시에 "10"을 읽고, 둘 다 11로 증가한 다음, 새 값을 11로 설정하는 일은 절대 일어나지 않습니다. 최종 값은 항상 12이고, 다른 모든 클라이언트가 동시에 명령을 실행하지 않는 동안 읽기-증가-설정 작업이 수행된다. —————————————————————————————————————————제한
    • 기본적으로 단일 Redis 문자열은 최대 512MB보다 클 수 없다.
    기본 명령
    • SET
    • 문자열 값을 저장합니다.
    • SETNX
    • 키가 이미 존재하지 않는 경우에만 문자열 값을 저장합니다. 잠금을 구현하는 데 유용합니다.
    • GET
    • 문자열 값을 검색합니다.
    • MGET
    • 단일 작업으로 여러 문자열 값을 검색합니다.
    카운터 관리
    • INCRBY
    • 주어진 키에 저장된 카운터를 독립적으로 증가시키고(음수를 전달할 때는 감소 시킨다).
    • 부동 소수점 카운터에 대한 또 다른 명령이 있습니다: INCRBYFLOAT
    비트 연산문자열 명령의 전체 목록을 확인하세요 .대부분의 문자열 연산은 O(1)이므로 매우 효율적이며, 그러나 O(n)이 될 수 있는 SUBSTR, GETRANGE 및 SETRANGE명령에는 주의해야 하며, 이러한 무작위 액세스 문자열 명령은 큰 문자열을 처리할 때 성능 문제를 일으킬 수 있다.구조화된 데이터를 직렬화된 문자열로 저장하는 경우 Redis 해시 나 JSON을 고려해 보는 것도 좋다
  • 대안
  • 성능
  • 문자열에 비트 연산을 수행하려면 비트맵 데이터 유형 문서를 참조하세요.
  • 문자열 가져오기 및 설정하기
  • 특징
  • INCR명령을 이용해서 문자열 값을 정수로 구문 분석하고, 1씩 증가시키고, 마지막으로 얻은 값을 새 값으로 설정하며, 이와 같은 다른 유사한 명령이 있습니다 INCRBYDECR내부적 DECRBY으로는 항상 동일한 명령이며, 약간 다른 방식으로 작동합니다.
  • 아래와 같이 MSET단일 명령에서 여러 키의 값을 설정하거나 검색하는 기능은 대기 시간을 줄이는 데에도 유용하다.
  • > set bike:1 bike nx (nil) > set bike:1 bike xx OK
  • 값은 모든 종류의 문자열(바이너리 데이터 포함)일 수 있습니다. 예를 들어, 값 안에 jpeg 이미지를 저장할 수 있습니다. 값은 512MB보다 클 수 없습니다.
  • > SET bike:1 Deimos OK > GET bike:1 "Deimos"
  • 텍스트, 직렬화된 객체, 이진 배열을 포함한 바이트 시퀀스를 저장하며, 문자열은 Redis 키와 연관시킬 수 있는 간단한 유형의 값이며, 종종 캐싱에 사용되며, 카운터를 구현하고 비트 연산도 수행할 수 있는 추가 기능을 지원한다.

Hash

.Redis 해시는 필드-값 쌍의 컬렉션으로 모델링된 레코드 유형이며, Redis 해시는 Python 사전 , Java HashMaps 및 Ruby 해시 와 유사하다.

  • Hash 설명
    • HSET
    • : 해시의 하나 이상의 필드 값을 설정합니다.
    • HGET
    • : 주어진 필드의 값을 반환합니다.
    • HMGET
    • : 하나 이상의 주어진 필드의 값을 반환합니다.
    • HINCRBY
    • : 주어진 필드의 값을 제공된 정수만큼 증가시킵니다.
    해시 명령의 전체 목록을 확인하세요 .
    > HINCRBY bike:1:stats rides 1
    (integer) 1
    > HINCRBY bike:1:stats rides 1
    (integer) 2
    > HINCRBY bike:1:stats rides 1
    (integer) 3
    > HINCRBY bike:1:stats crashes 1
    (integer) 1
    > HINCRBY bike:1:stats owners 1
    (integer) 1
    > HGET bike:1:stats rides
    "3"
    > HMGET bike:1:stats owners crashes
    1) "1"
    2) "1"
    
    필드 만료다음 명령을 사용하여 특정 필드에 대한 정확한 만료 시간이나 TTL 값을 설정하세요.
    • HEXPIRE
    • : 남은 TTL을 초 단위로 설정합니다.
    • HPEXPIRE
    • : 남은 TTL을 밀리초 단위로 설정합니다.
    • HEXPIREAT
    • : 만료 시간을 타임스탬프 1 로 설정합니다 (초 단위).
    • HPEXPIREAT
    • : 만료 시간을 밀리초 단위로 지정된 타임스탬프로 설정합니다.
    다음 명령을 사용하여 특정 필드가 만료되는 정확한 시간이나 남은 TTL을 검색합니다.
    • HEXPIRETIME
    • : 만료 시간을 초 단위의 타임스탬프로 가져옵니다.
    • HPEXPIRETIME
    • : 만료 시간을 밀리초 단위의 타임스탬프로 가져옵니다.
    • HTTL
    • : 남은 TTL을 초 단위로 가져옵니다.
    • HPTTL
    • : 남은 TTL을 밀리초 단위로 가져옵니다.
    다음 명령을 사용하여 특정 필드의 만료를 제거가 가능하다
    • HPERSIST
    • : 만료일을 제거합니다.
    일반적인 필드 만료 사용 사례
    1. 이벤트 추적 : 해시 키를 사용하여 지난 1시간의 이벤트를 저장합니다. 각 이벤트의 TTL을 1시간으로 설정합니다. **HLEN**지난 1시간의 이벤트를 계산하는 데 사용합니다.
    2. 사기 감지 : 이벤트에 대한 시간별 카운터가 있는 해시를 만듭니다. 각 필드의 TTL을 48시간으로 설정합니다. 해시를 쿼리하여 지난 48시간 동안 시간당 이벤트 수를 가져옵니다.
    3. 고객 세션 관리 : 해시 키에 고객 데이터를 저장합니다. 각 세션에 대해 새 해시 키를 만들고 고객의 해시 키에 세션 필드를 추가합니다. 세션이 만료되면 고객의 해시 키에 있는 세션 키와 세션 필드를 모두 자동으로 만료합니다.
    4. 활성 세션 추적 : 모든 활성 세션을 해시 키에 저장합니다. 각 세션의 TTL을 비활성 후 자동으로 만료되도록 설정합니다. **HLEN**활성 세션을 계산하는 데 사용합니다.
    성능HKEYSHVALS, , 와 같은 일부 명령 HGETALL과 만료 관련 명령의 대부분은 O(n)입니다. 여기서 n 은 필드-값 쌍의 개수입니다.모든 해시는 최대 4,294,967,295(2^32 - 1)개의 필드-값 쌍을 저장할 수 있습니다. 실제로 해시는 Redis 배포를 호스팅하는 VM의 전체 메모리에 의해서만 제한됩니다.
  • 모든 타임스탬프는 Unix epoch 이후의 초 또는 밀리초 단위로 지정됩니다
  • 제한
  • 대부분의 Redis 해시 명령은 O(1)입니다.
  • Redis Community Edition 7.4의 새로운 기능은 개별 해시 필드에 만료 시간 또는 수명(TTL) 값을 지정하는 기능입니다. 이 기능은 키 만료 와 유사 하며 여러 유사한 명령을 포함합니다.
  • 예시
  • 기본 명령

List

Redis 목록은 삽입 순서에 따라 정렬된 문자열 목록이다.

  • List 설명
    • 스택과 큐를 구현합니다.
    • 백그라운드 워커 시스템을 위한 큐 관리를 구축합니다.
    Basic commands
    • LPUSH
    • 리스트의 머리에 새로운 요소를 추가합니다.
    • **RPUSH** 리스트의 꼬리에 추가합니다.
    • LPOP
    • 리스트의 머리부분에서 요소를 제거하고 반환합니다.
    • RPOP
    • 리스트의 꼬리부분에서도 요소를 제거하고 반환합니다.
    • LLEN
    • 목록의 길이를 반환합니다.
    • LMOVE
    • 한 목록의 요소를 다른 목록으로 원자적으로 이동합니다.
    • LRANGE
    • 목록에서 다양한 요소를 추출합니다.
    • LTRIM
    • 목록을 지정된 범위의 요소로 줄입니다.
    Blocking commands
    • BLPOP
    • 리스트의 헤드에서 요소를 제거하고 반환합니다. 리스트가 비어 있으면 명령은 요소가 사용 가능해지거나 지정된 시간 초과에 도달할 때까지 차단됩니다.
    • BLMOVE
    • 원자적으로 소스 목록에서 대상 목록으로 요소를 이동합니다. 소스 목록이 비어 있으면 명령은 새 요소가 사용 가능해질 때까지 차단됩니다.
    전체 목록 명령 시리즈를 확인하세요 .
    • 사용자가 소셜 네트워크에 게시한 최신 업데이트를 기억
    • 소비자-생산자 패턴을 사용하여 프로세스 간 통신을 수행하는데, 생산자는 항목을 목록에 푸시하고 소비자는 해당 항목을 소비하고 작업을 실행하며, Redis에는 이 사용 사례를 보다 안정적이고 효율적으로 만드는 특수 목록 명령이 있다.
    예를 들어 인기 있는 Ruby 라이브러리 인 resque 와 sidekiq는 둘 다 백그라운드 작업을 구현하기 위해 Redis 리스트를 내부적으로 사용합니다.일반적인 사용 사례를 단계별로 설명하자면, 홈페이지에 사진 공유 소셜 네트워크에 게시된 최신 사진이 표시되고 접근 속도를 높이고 싶다고 가정해 보겠습니다.
    • 사용자가 새로운 사진을 게시할 때마다 우리는 해당 사진의 ID를 **LPUSH** 를 이용해 목록에 추가합니다 ****
    • 사용자가 홈페이지를 방문하면, 우리는 LRANGE 0 9 최신 게시된 10개 항목을 가져오기 위해 사용한다.
    제한성능대안
  • 불확실한 일련의 이벤트를 저장하고 처리해야 하는 경우 목록 대신 Redis 스트림을 고려해보세요 .
  • 머리 또는 꼬리에 액세스하는 목록 작업은 O(1)이며, 이는 매우 효율적이라는 것을 의미합니다. 그러나 목록 내의 요소를 조작하는 명령은 일반적으로 O(n)입니다. 이러한 예로는 LINDEXLINSERT, 및 가 있습니다 LSET. 이러한 명령을 실행할 때는 특히 큰 목록에서 작업할 때 주의하십시오.
  • Redis 리스트의 최대 길이는 2^32 - 1 (4,294,967,295)개의 요소입니다.
  • 인기 있는 Twitter 소셜 네트워크는 사용자가 게시한 최신 트윗을 Redis 목록으로 가져온다.
  • List 일반적인 사용 사례
  • 목록은 여러 차단 명령을 지원합니다. 예를 들어:
  • Redis 리스트는 문자열 값의 연결 리스트입니다. Redis 리스트는 다음과 같은 경우에 자주 사용됩니다.

Sets

Redis 세트는 고유한 문자열의 순서 없는 컬렉션으로, 선호하는 프로그래밍 언어(예: Java HashSets , Python 세트 등)의 세트처럼 작동하며, Redis 세트를 사용하면 O(1) 시간(즉, 세트 요소의 수에 관계없이)으로 추가, 제거 및 존재 여부를 테스트할 수 있다.

  • Sets 설명
    • 고유한 항목을 추적 ( 예 : 특정 블로그 게시물에 엑세스하는 모든 고유한 IP 주소를 추적)
    • 관계 ( 예 : 주어진 역할을 가진 모든 사용자 집합)를 나타낸다.
    • 교집합, 합집합, 차집합과 같은 일반적인 집합 연산을 수행한다.
    Basic commands
    • SADD
    • 세트에 새로운 멤버를 추가합니다.
    • SREM
    • 지정된 멤버를 집합에서 제거합니다.
    • SISMEMBER
    • 문자열의 집합 멤버십을 테스트합니다.
    • SINTER
    • 두 개 이상의 집합이 공통적으로 가지고 있는 멤버 집합(즉, 교집합)을 반환합니다.
    • SCARD
    • 집합의 크기(일명 카디널리티)를 반환합니다.
    전체 명령 집합 목록을 확인하세요 .최대 크기는 2^32 - 1 (4,294,967,295)개의 멤버이다.추가, 제거, 항목이 집합 멤버인지 확인하는 등 대부분의 집합 작업은 O(1)이며, 이는 효율성이 매우 높다는 것을 의미하며, 그러나 수 십만 명 이상의 구성원이 포함된 대규모 Sets의 경우  SMEMBERS명령을 실행할 때 주의해야 합니다. 이 명령은 O(n)이며 단일 응답으로 전체 Sets를 반환하며, 대안으로 집합의 모든 구성원을 반복적으로 검색할 수 있는  SSCAN을 고려해야한다.대규모 데이터 세트(또는 스트리밍 데이터)에 대한 멤버십 확인을 설정하면 많은 메모리를 사용할 수 있습니다. 메모리 사용량이 걱정되고 완벽한 정밀도가 필요하지 않은 경우 세트 대신  Bloom filter or Cuckoo filter를 고려 해야한다. Redis Sets는 일종의 인덱스로 자주 사용되며, 데이터를 인덱싱하고 쿼리해야 하는 경우 JSON 데이터 유형과 검색 및 쿼리 기능을 고려해야한다.
  • Alternatives
  • Performance
  • Limits
  • Sets는 고유한 문자열의 순서 없는 collection이며, 아래와 같은 일을 효율적으로 수행할 수 있습니다.

Sorted sets

Redis Sorted sets는 각 문자열의 관련 점수에 따라 순서를 유지하는 고유한 문자열 모음이다.

  • Sorted sets 설명
    • 리더보드. 예를 들어, Sorted sets를 사용하면 대규모 온라인 게임에서 가장 높은 점수를 순서대로 나열한 목록을 쉽게 유지할 수 있다.
    • 속도 제한기. 특히, 과도한 API 요청을 방지하기 위해 Sorted sets사용하여 슬라이딩 윈도우 속도 제한기를 구축할 수 있다.
    Sorted sets를 Sets와 해시의 혼합으로 생각할 수 있으며, 집합과 마찬가지로 정렬된 집합은 고유하고 반복되지 않는 문자열 요소로 구성되므로 어떤 의미에서는 정렬된 집합도 집합이지만
    • B와 A가 점수가 다른 두 요소인 경우 A.score가 B.score보다 크면 A > B이다.
    • B와 A의 점수가 정확히 같은 경우 A 문자열이 B 문자열보다 사전순으로 크면 A > B입니다. 정렬된 세트에는 고유한 요소만 있으므로 B 및 A 문자열은 동일할 수 없습니다.
    Basic commands
    • ZADD
    • 정렬된 세트에 새 멤버와 연관된 점수를 추가합니다. 멤버가 이미 있는 경우 점수가 업데이트된다.
    • ZRANGE
    • 지정된 범위 내에서 정렬된 집합의 멤버를 반환한다.
    • ZRANK
    • 정렬이 오름차순이라고 가정하고 제공된 멤버의 순위를 반환한다.
    • ZREVRANK
    • 정렬된 집합이 내림차순이라고 가정하고 제공된 멤버의 순위를 반환한다.
    정렬된 세트 명령의 전체 목록을 확인할 수 있다.대부분의 정렬 집합 연산은 O(log(n))입니다. 여기서 n은 멤버 수이며, 큰 반환 값(예: 수만 개 이상)을 사용하여 ZRANGE 명령을 실행할 때는 주의를 기울여야 하며, 이 명령의 시간 복잡도는 O(log(n) + m)이며, 여기서 m은 반환된 결과 수 이다.Redis Sorted sets는 때때로 다른 Redis 데이터 구조를 인덱싱하는 데 사용되며, 데이터를 인덱싱하고 쿼리해야 하는 경우 JSON 데이터 유형과 검색 및 쿼리 기능을 고려해야한다.
  • Alternatives
  • Performance
  • 그러나 Sets 내부의 요소는 순서가 지정되지 않지만 정렬된 세트의 모든 요소는 점수라고 하는 부동 소수점 값과 연결된다 (이것이 모든 요소가 값에 매핑되므로 유형이 해시와 유사한 이유이기도 합니다) 또한 정렬된 집합의 요소는 순서대로 가져옵니다(따라서 요청 시 순서가 지정되지 않습니다. 순서는 정렬된 집합을 나타내는 데 사용되는 데이터 구조의 특성입니다). 다음 규칙에 따라 순서가 지정된다.
  • Redis 정렬 세트는 관련 점수에 따라 정렬된 고유 문자열(구성원) 모음이며, 둘 이상의 문자열에 동일한 점수가 있는 경우 문자열은 사전 순으로 정렬되며. 정렬된 세트의 일부 사용 사례는 다음과 같다.

Streams

Redis Streams 추가 전용 로그처럼 작동하는 데이터 구조이며, Stream은 이벤트가 발생하는 순서대로 기록한 다음 처리를 위해 배포하는 데 도움이 됩니다.

Redis Streams

Bitmaps

Redis 비트맵을 사용하면 문자열에 대한 비트별 작업을 수행할 수 있다.

  • Bitmaps 설명하나 이상의 문자열에 대해 비트 연산을 수행할 수 있습니다. 비트맵 사용 사례의 몇 가지 예는 다음과 같습니다.
    • 집합의 구성원이 정수 0-N에 해당하는 경우에 대한 효율적인 집합 표현이다.
    • 각 비트가 특정 권한을 나타내는 개체 권한. 파일 시스템이 권한을 저장하는 방식과 유사하다.
    Basic commands
    • SETBIT
    • 제공된 오프셋의 비트를 0 또는 1로 설정합니다.
    • GETBIT
    • 주어진 오프셋에서 비트 값을 반환합니다.
    Performance
  • SETBIT 및  GETBIT는 O(1)입니다.  BITOP은 O(n)입니다. 여기서 n은 비교에서 가장 긴 문자열의 길이입니다.
  • 비트맵은 실제 데이터 유형이 아니지만 비트 벡터처럼 처리되는 문자열 유형에 정의된 비트 지향 연산 세트이며, 문자열은 바이너리 안전 blob이고 최대 길이가 512MB이므로 최대 2^32개의 서로 다른 비트를 설정하는 데 적합하다.

Bitfields

Redis 비트 필드는 문자열 값의 여러 카운터를 효율적으로 인코딩하며, 비트필드는 원자성 가져오기, 설정 및 증분 작업을 제공하고 다양한 오버플로 정책을 지원한다.

  • Biffields 설명Basic commands
    • BITFIELD
    • 하나 이상의 값을 원자적으로 설정하고, 증가시키고, 읽는다.
    • **BITFIELD_RO**
    • BITFIELD의 읽기 전용 변형이다.
    Performance
  • BITFIELD는 O(n)이며, 여기서 n은 액세스된 카운터 수 이다.
  • Redis 비트 필드를 사용하면 임의의 비트 길이의 정수 값을 설정, 증가 및 가져올 수 있으며, 예를 들어, 부호 없는 1비트 정수부터 부호 있는 63비트 정수까지 모든 것에 대해 작업을 수행할 수 있다. 이러한 값은 바이너리로 인코딩된 Redis 문자열을 사용하여 저장됩니다. 비트필드는 원자성 읽기, 쓰기 및 증분 작업을 지원하므로 카운터 및 유사한 숫자 값을 관리하는 데 적합합니다.

Geospatial indexes

Redis 지리공간 인덱스는 지정된 지리적 반경 또는 경계 상자 내에서 위치를 찾는 데 유용하다.

  • Geospatial 설명Basic commands
    • GEOADD 주어진 지리공간 색인에 위치를 추가한다. (이 명령을 사용하면 경도가 위도보다 앞에 옵니다).
    • GEOSEARCH 지정된 반경 또는 경계 상자가 있는 위치를 반환한다.
  • Redis 지리공간 인덱스를 사용하면 좌표를 저장하고 검색할 수 있으며, 이 데이터 구조는 주어진 반경이나 경계 상자 내에서 가까운 지점을 찾는 데 유용하다.

참고 링크 : https://redis.io/docs/latest/develop/data-types/

728x90

'Server > Redis' 카테고리의 다른 글

Redis 아키텍처  (0) 2024.09.10