Computer >> 컴퓨터 >  >> 프로그램 작성 >> Redis

Streams가 있는 Redis의 시계열

Redis는 종종 몇 가지 간단한 데이터 구조 기본 요소에 네트워크 인터페이스를 제공하는 "데이터 구조 서버"로 생각됩니다. 스트림은 Redis가 몇 년 전에 정렬된 집합을 도입한 이후 처음으로 새롭게 등장한 범용 데이터 구조입니다. 이 새로운 구조의 주요 용도 중 하나인 시계열 데이터 모델링을 살펴보겠습니다.

스트림:새로운 Redis 데이터 구조

Redis 스트림은 키-값 쌍의 추가 전용 시계열을 나타냅니다.

많은 클라이언트가 스트림에 쓸 수 있으며 그럴 때마다 시계열에 삽입된 항목의 고유한 오름차순 ID를 받습니다.

데이터를 읽는 클라이언트는 들어오는 새 데이터를 수신하는 동안 차단할 수 있고, 일괄 처리를 위해 읽은 마지막 메시지의 "북마크"를 유지하거나 작업 부하를 공유하고 메시지를 확인하기 위해 보다 복잡한 "소비자 그룹"으로 구성할 수 있습니다.

스트림은 큰 주제이므로 이 게시물에서는 Redis에서 시계열 데이터를 모델링하는 데 스트림을 사용하는 방법을 간략하게 살펴보겠습니다. 새로운 데이터 구조는 시계열을 모델링하기 위해 List 또는 SortedSet 유형을 사용하는 것과 같은 이전 접근 방식보다 훨씬 더 간단합니다.

여기의 코드 예제에서는 node.js용 ioredis 클라이언트를 사용할 것입니다.

var Redis = require('ioredis');
var redis = new Redis();

스트림에 데이터 보내기

스트림은 추가 전용이므로 일반적으로 필요한 유일한 세부 정보는 기록하려는 Redis 키의 이름과 키-값 쌍 세트입니다.

대기 질 센서의 측정값을 기록하고 키-값 쌍의 스트림을 site:pdx로 보냅니다. 키 - 특히 현재 대기질 지수와 섭씨 온도를 보내고 있습니다.

redis.xadd('site:pdx', '*',
           'aqi', 37,
           'tempc', 5.1).then(function(id) {
  console.log("id:", id);
});

> 1527974818120-0

XADD를 보냅니다. 기록할 새 측정이 있을 때마다 명령을 실행합니다. 응답은 쿼리에 사용할 수 있는 고유한 항상 오름차순 ID입니다. ID의 첫 번째 부분인 1527974818120 Redis 서버에서 할당한 타임스탬프입니다. ID의 두 번째 부분은 여러 클라이언트가 동시에 쓸 수 있는 경우 충돌을 피하기 위해 증가하는 숫자입니다.

* 제공 위에 표시된 대로 쓰기 명령의 두 번째 인수로 Redis가 자체 타임스탬프와 함께 데이터를 저장하도록 알립니다.

데이터를 쓸 때 타임스탬프를 제공하는 것도 가능하지만 일반적으로 선호되지 않습니다. Redis가 타임스탬프를 선택하도록 하면 클라이언트가 ID 선택 및 순서에 대해 조정할 필요 없이 여러 클라이언트가 단일 스트림에 데이터를 동시에 쓸 수 있습니다. Redis 서버는 해당 세부 정보만 처리합니다. 클라이언트.

간단한 읽기

스트림에 값이 몇 개 있으면 ID 또는 타임스탬프 범위를 제공하여 값 범위를 검색할 수 있습니다. 이것은 그래프에 가장 최근의 대기 질 측정값을 표시하는 앱에서 사용할 수 있습니다.

redis.xrange('site:pdx',
             '1527974818120-0',
             '+',
             'COUNT', 5).then(function(resp) {

  // resp now holds 5 readings, pass them to the open graph:
  // console.log(resp);
});

> [ [ '1543947167906-0', [ 'aqi', '31', 'tempc', '5.1' ] ],
> [ '1543947168312-0', [ 'aqi', '31', 'tempc', '5.3' ] ],
> [ '1543947168901-0', [ 'aqi', '31', 'tempc', '5.4' ] ],
> [ '1543947170033-0', [ 'aqi', '31', 'tempc', '5.4' ] ],
> [ '1543947171460-0', [ 'aqi', '31', 'tempc', '5.6' ] ] ]

스트림의 모든 위치에서 숫자 범위를 샘플링할 수 있으므로 그래프 시스템이 성능 저하 없이 기록 데이터를 쿼리할 수 있습니다.

차단 및 폴링

데이터 범위를 쿼리하는 것은 그래프 및 기록 모니터링에 유용하지만 때때로 들어오는 데이터에 즉시 응답할 수 있는 시스템을 구축하려는 경우가 있습니다. Redis 스트림은 XREAD를 사용하여 이 작업에도 매우 적합합니다. :

redis.xread('BLOCK', 10000,
            'STREAMS', 'site:pdx', '$').then(function(resp) {

  // close the windows if aqi > 50
  console.log(resp);
});

이와 같은 차단 작업은 데이터가 들어올 때까지 또는 타임아웃(여기서는 1000ms)까지 기다리므로 지속적인 폴링을 유지하려면 데이터를 사용할 수 있을 때까지 위의 예에서와 같이 차단하고 동일한 XREAD를 호출하기만 하면 됩니다. 데이터가 수신되거나 명령 시간이 초과될 때마다 다시 명령하십시오.

스트림에 대한 연결 간에 데이터가 누락되지 않도록 하려면 스트림에서 읽을 때 스트림에서 읽은 마지막 ID를 제공할 수 있습니다. 그렇게 하면 중단한 부분에서 정확히 다시 시작할 수 있습니다.

위의 경우 스트림에 들어오는 모든 데이터를 원했기 때문에 "새 데이터만"을 나타내기 위해 특수 토큰 '$'를 사용했습니다. 명령은 제공된 ID로 약간 다르게 보입니다.

redis.xread('BLOCK', 10000,
            'STREAMS', 'site:pdx', '1543947171460-0');

데이터를 수락하는 첫 번째 스트림에서 값을 반환하여 한 번에 여러 스트림을 읽을 수도 있습니다.

redis.xread('BLOCK', 10000,
            'STREAMS',
              'site:pdx', 'site:global',
              '1543947171460-0', '$');

이 예에서 명령은 ID1543947171460-0보다 최신 데이터가 있을 때 반환됩니다. site:pdx에 작성되었습니다. , 또는 임의 새 데이터는 site:global에 작성됩니다. .

소비자 조정

스트림을 통해 흐르는 많은 데이터가 있으면 인바운드 메시지를 처리하는 소비자의 여러 복사본이 필요할 수 있습니다. 이러한 소비자는 메시지를 선택하고 조치를 취한 다음 작업이 완료되었음을 "인정"해야 합니다. Redis 스트림은 이러한 작업을 위한 기본 요소도 제공합니다. 여기에서 다루기에는 너무 많지만 자세한 내용은 설명서를 참조하세요.

스트림 명령에 대한 빠른 참조

스트림에 사용할 수 있는 새로운 Redis 명령이 많이 있습니다! 다음은 빠른 참조입니다. 공식 문서에서 자세한 내용을 확인할 수 있습니다.

간단한 명령:

  • XADD:스트림에 항목(키-값 쌍 번들) 추가
  • XRANGE 및 XREVRANGE:범위 선택 또는 스트림 항목 반복
  • XREAD:일부 ID보다 최신 항목 가져오기(선택적으로 차단)
  • XTRIM:스트림을 다듬기 위해 오래된 항목을 버립니다.
  • XDEL:스트림에서 특정 항목 제거
  • XLEN:스트림의 항목 계산
  • XINFO:스트림 메타데이터 검사

소비자 그룹 명령:

  • XGROUP:소비자 그룹 생성, 삭제 또는 재설정 및 해당 구성원 제거
  • XREADGROUP:XREAD(위)와 비슷하지만 소비자 그룹을 사용하여 메시지 수신
  • XPENDING:소비자 그룹에 전달되었지만 확인되지 않은 메시지를 검사합니다.
  • XACK:소비자 그룹에 대한 메시지 확인, 보류 목록에서 제거
  • XCLAIM:죽은 소비자의 메시지 인계

사용 사례

스트림의 가장 일반적으로 인용되는 사용 사례는 센서가 스트림에 데이터를 넣어 소비자가 다양한 방식으로 사용할 수 있도록 하는 IoT 워크로드입니다(분석, 콜드 스토리지로 보관, 그래프에 표시). 크기 제한이 있는 스트림은 여기에서 훌륭한 사용 사례이므로 예측 가능한 메모리 공간으로 고정 크기 스트림을 할당할 수 있습니다.

스트림은 이전에 다른 Redis 데이터 구조를 사용한 애플리케이션에서도 사용하기에 적합합니다. Celery 및 Sidekiq와 같은 대기 응용 프로그램은 Streams의 소비자 그룹이 Redis-native 방식으로 읽기 영수증 검사를 제공하는 데 유리할 수 있습니다. pubsub는 클라이언트에 게시된 후 메시지를 유지하지 않기 때문에 Redis Streams로 더욱 강력하게 만들 수 있는 Redis pubsub를 사용하는 간단한 채팅 앱을 보여주는 블로그 게시물이 많이 있습니다.

사용할 준비가 되셨습니까?

몇 번의 클릭으로 새로운 RedisGreen 서버에서 Redis 스트림을 시도할 수 있습니다.