Computer >> 컴퓨터 >  >> 프로그래밍 >> Redis

RedisTimeSeries 1.6 정식 출시! 주요 신규 기능 완벽 정리

오늘 우리는 RedisTimeSeries 1.6의 정식 출시(GA)를 발표하게 되어 기쁩니다. 이번 글에서는 새롭게 제공되는 주요 기능들을 자세히 살펴보겠습니다.

RedisTimeSeries란?

RedisTimeSeries는 Redis를 위한 고성능 메모리 우선(memory-first) 시계열 데이터 구조입니다. 멀티 테넌시(multi-tenancy)를 지원하여 여러 시계열을 동시에 저장할 수 있으며, 여러 클라이언트가 이 시계열들에 동시에 접근하는 것도 가능합니다. 현재는 Redis Stack의 일부로도 제공됩니다.

RedisTimeSeries 1.6의 주요 신규 기능

  • 강화된 쿼리 기능
    • 시계열 간(cross-time series) 집계
    • 타임스탬프 또는 샘플 값 기반 결과 필터링
    • 가져올 라벨 선택
    • 집계 버킷 정렬(ALIGN)
    • 샘플 삭제
  • 성능 개선
  • 키스페이스 알림(Keyspace notifications)
  • Redis on Flash를 위한 Redis Enterprise 지원

강화된 쿼리 기능

시계열 간 집계

1.6 버전 이전에는 다음과 같은 한 가지 유형의 집계만 가능했습니다.

  • 단일 시계열 – 일정한 시간 간격(timeframe) 단위로 샘플을 집계

1.6 버전부터는 두 가지 새로운 집계 유형이 추가되었습니다.

  • 여러 시계열 – 동일한 타임스탬프를 가진 샘플들을 시계열 집합 전체에 걸쳐 집계
  • 여러 시계열 – 먼저 각 시계열을 일정한 시간 간격으로 집계한 후, 각 구간별로 그 결과를 시계열 집합 전체에 걸쳐 다시 집계

첫 번째 새로운 집계 유형을 예제로 살펴보겠습니다. 먼저 두 개의 주식을 생성하고, 서로 다른 3개의 타임스탬프에 가격을 추가합니다.

TS.CREATE stock:A LABELS type stock name A
TS.CREATE stock:B LABELS type stock name B
TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
TS.MADD stock:B 1000 120 stock:B 1010 110 stock:B 1020 100

이제 타임스탬프별 최대 주가를 조회할 수 있습니다.

redis:6379> TS.MRANGE - + WITHLABELS FILTER type=stock GROUPBY type REDUCE max
1) 1) "type=stock"
2) 1) 1) "type"
2) "stock"
2) 1) "__reducer__"
2) "max"
3) 1) "__source__"
2) "stock:A,stock:B"
3) 1) 1) (integer) 1000
2) 120
2) 1) (integer) 1010
2) 110
3) 1) (integer) 1020
2) 120

FILTER type=stock 절은 주식 가격을 나타내는 시계열만 남깁니다. GROUPBY type REDUCE max 절은 동일한 type 값을 가진 시계열들을 그룹으로 묶은 뒤, 각 타임스탬프마다 같은 type 값을 공유하는 모든 시계열을 max 애그리게이터로 집계합니다.

FILTER label=value는 TS.MRANGE와 TS.MREVRANGE에서 지원되며, 그 외에도 다양한 필터링 절을 사용할 수 있습니다(자세한 내용은 문서 참조).

다음으로 두 번째 새로운 집계 유형을 살펴보겠습니다.

먼저 두 개의 주식을 생성하고, 서로 다른 9개의 타임스탬프에 가격을 추가합니다.

TS.CREATE stock:A LABELS type stock name A
TS.CREATE stock:B LABELS type stock name B
TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
TS.MADD stock:B 1000 120 stock:B 1010 110 stock:B 1020 100
TS.MADD stock:A 2000 200 stock:A 2010 210 stock:A 2020 220
TS.MADD stock:B 2000 220 stock:B 2010 210 stock:B 2020 200
TS.MADD stock:A 3000 300 stock:A 3010 310 stock:A 3020 320
TS.MADD stock:B 3000 320 stock:B 3010 310 stock:B 3020 300

이제 각 주식에 대해 1000밀리초 구간별 평균 주가를 계산한 뒤, 해당 구간에서 평균값이 가장 큰 주식을 조회해 보겠습니다.

redis:6379> TS.MRANGE - + WITHLABELS AGGREGATION avg 1000 FILTER type=stock GROUPBY type REDUCE max
1) 1) "type=stock"
2) 1) 1) "type"
2) "stock"
2) 1) "__reducer__"
2) "max"
3) 1) "__source__"
2) "stock:A,stock:B"
3) 1) 1) (integer) 1000
2) 110
2) 1) (integer) 2000
2) 210
3) 1) (integer) 3000
2) 310

GROUPBY label REDUCE reducer는 TS.MRANGE와 TS.MREVRANGE에서 지원됩니다.

reducer로는 sum, min, max를 사용할 수 있습니다.

타임스탬프 또는 샘플 값 기반 필터링

TS.RANGE, TS.REVRANGE, TS.MRANGE, TS.MREVRANGE를 사용할 때 항상 모든 샘플을 조회하거나 집계하고 싶지는 않을 것입니다.

[FILTER_BY_TS ts...]를 사용하면 특정 타임스탬프 목록으로 샘플을 필터링할 수 있습니다.

[FILTER_BY_VALUE min max]를 사용하면 최솟값과 최댓값 범위로 샘플을 필터링할 수 있습니다.

예를 들어, 정상적인 값이 -100에서 100 사이인 지표를 샘플링하는데, 측정 오류를 나타내기 위해 9999라는 값을 사용한다고 가정해 보겠습니다.

TS.CREATE temp:TLV LABELS type temp location TLV
TS.MADD temp:TLV 1000 30 temp:TLV 1010 35 temp:TLV 1020 9999 temp:TLV 1030 40

이제 범위를 벗어난 값을 무시하고 모든 값을 조회해 보겠습니다.

TS.RANGE temp:TLV - + FILTER_BY_VALUE -100 100

마찬가지로 범위를 벗어난 값을 제외한 평균값도 조회할 수 있습니다.

TS.RANGE temp:TLV - + FILTER_BY_VALUE -100 100 AGGREGATION avg 1000

가져올 라벨 선택

TS.MRANGE, TS.MREVRANGE, TS.MGET 사용 시 매칭되는 시계열에 연결된 모든 라벨 값이 아니라, 선택한 라벨의 값만 필요한 경우가 있습니다.

SELECTED_LABELS를 사용하면 가져올 라벨을 선택할 수 있습니다. 다음과 같은 시계열과 데이터가 있다고 가정해 보겠습니다.

TS.CREATE temp:TLV LABELS type temp location TLV
TS.MADD temp:TLV 1000 30 temp:TLV 1010 35 temp:TLV 1020 9999 temp:TLV 1030 40

매칭된 시계열에 연결된 모든 라벨을 가져오려면 WITHLABELS를 사용합니다.

redis:6379> TS.MGET WITHLABELS FILTER type=temp
1) 1) "temp:TLV"
2) 1) 1) "type"
2) "temp"
2) 1) "location"
2) "TLV"
3) 1) (integer) 1030
2) 40

하지만 location만 필요하다면 SELECTED_LABELS를 사용하면 됩니다.

redis:6379> TS.MGET SELECTED_LABELS location FILTER type=temp
1) 1) "temp:TLV"
2) 1) 1) "location"
2) "TLV"
3) 1) (integer) 1030
2) 40

집계 버킷 정렬(ALIGN)

일평균 기온을 조회하고 싶지만 '하루'가 06:00에 시작된다고 가정해 보겠습니다. 이 경우 00:00~23:59가 아닌 06:00~05:59 기준으로 구간을 정렬하고 싶을 것입니다.

TS.RANGE, TS.REVRANGE, TS.MRANGE, TS.MREVRANGE 사용 시 이제 ALIGN 옵션을 통해 집계 버킷을 요청된 시작 시점, 종료 시점 또는 특정 타임스탬프에 맞춰 정렬할 수 있습니다.

정렬 기능을 시연하기 위해 다음 데이터를 추가해 보겠습니다.

TS.CREATE stock:A LABELS type stock name A
TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
TS.MADD stock:A 1030 200 stock:A 1040 210 stock:A 1050 220
TS.MADD stock:A 1060 300 stock:A 1070 310 stock:A 1080 320

먼저 ALIGN 없이(즉, 기본 정렬값 0으로) 집계해 보겠습니다.

redis:6379> TS.RANGE stock:A - + AGGREGATION min 20
1) 1) (integer) 1000
2) 100
2) 1) (integer) 1020
2) 120
3) 1) (integer) 1040
2) 210
4) 1) (integer) 1060
2) 300
5) 1) (integer) 1080
2) 320

이번에는 ALIGN을 적용해 보겠습니다.

redis:6379> TS.RANGE stock:A - + ALIGN 10 AGGREGATION min 20
1) 1) (integer) 990
2) 100
2) 1) (integer) 1010
2) 110
3) 1) (integer) 1030
2) 200
4) 1) (integer) 1050
2) 220
5) 1) (integer) 1070
2) 310

ALIGN을 10으로 설정하면 첫 번째 버킷이 시점 10에서 시작하고, 나머지 버킷들(각각 20밀리초 길이)도 이에 맞춰 정렬됩니다.

범위 쿼리의 시작 타임스탬프가 명시적으로 지정된 경우('-'가 아닌 경우), align을 '-' 또는 'start'로 설정하여 해당 시점에 맞출 수도 있습니다.

redis:6379> TS.RANGE stock:A 5 + ALIGN start AGGREGATION min 20
1) 1) (integer) 985
2) 100
2) 1) (integer) 1005
2) 110
3) 1) (integer) 1025
2) 200
4) 1) (integer) 1045
2) 220
5) 1) (integer) 1065
2) 310

마찬가지로 종료 타임스탬프가 명시적으로 지정된 경우('+'가 아닌 경우), align을 '+' 또는 'end'로 설정하여 해당 시점에 맞출 수 있습니다.

샘플 삭제

TS.DEL을 사용하면 특정 시계열에서 두 타임스탬프 사이의 샘플을 삭제할 수 있습니다.

예를 들어 TS.DEL stock:A 1020 1050은 타임스탬프 1020에서 1050 사이(양 끝 포함)의 모든 샘플을 삭제합니다. 반환값은 삭제된 샘플의 개수입니다.

성능 개선

수많은 최적화가 적용되어, 이제 대부분의 쿼리가 RedisTimeSeries 1.4에 비해 훨씬 빠르게 실행됩니다.

다음 표는 단일 노드에서 TSBS 쿼리(여기서 설명한 바 있습니다)로 달성 가능한 초당 쿼리 수를 보여줍니다. 표에는 1.4 버전에서 지원했던 TSBS 쿼리 중 일부만 나열되어 있습니다.

쿼리 유형v1.4
queries/sec
v1.6
queries/sec
% 변화 (높을수록 좋음)
tsbs-scale100_cpu-max-all-1138815008.07%
tsbs-scale100_double-groupby-11001088.00%
tsbs-scale100_groupby-orderby-limit793128261.66%
tsbs-scale100_single-groupby-1-1-1134482134758.74%
tsbs-scale100_single-groupby-1-1-122383392164.54%

RedisTimeSeries 1.4에 비해 초당 처리 가능한 쿼리 수가 8%에서 65%까지 향상된 것을 확인할 수 있습니다.

키스페이스 알림

Redis 키스페이스 알림(Keyspace notifications)은 Redis 클라이언트가 Pub/Sub 채널을 구독하여 Redis 데이터셋에 영향을 미치는 이벤트를 수신할 수 있도록 해줍니다. 예를 들어 RedisGears와 함께 사용하면 이 알림을 통해 함수를 트리거할 수 있습니다.

이를 활용하면 샘플 스트림을 수신 대기하면서 실시간으로 예측과 경고를 생성하는 시계열 예측기나 이상 감지기를 구현할 수 있습니다. 다양한 RedisTimeSeries 명령을 구독하고 이벤트를 생성하는 테스트 사례를 참고해 보세요.

Redis on Flash를 위한 Redis Enterprise 지원

1.6 버전부터 RedisTimeSeries는 Redis on Flash 환경에서 실행할 수 있습니다. 다만 RoF는 키(key) 수준에서 구현된다는 점에 유의해야 합니다. 즉, 시계열 전체의 값이 FLASH 또는 RAM 중 한 곳에 저장됩니다.

RedisTimeSeries는 이제 Redis Stack의 일부

RedisTimeSeries는 이제 Redis Stack에 포함되어 있습니다. macOS, Ubuntu 또는 Redhat용 최신 Redis Stack Server 바이너리를 다운로드하거나, Docker, Homebrew, Linux를 통해 설치할 수 있습니다.

RedisInsight로 시계열 데이터 시각화하기

RedisInsight는 개발자를 위한 시각적 도구로, Redis 또는 Redis Stack을 사용하는 개발 과정에서 RedisTimeSeries 데이터를 손쉽게 탐색할 수 있는 훌륭한 방법을 제공합니다.

그래픽 사용자 인터페이스에서 직접 시계열 쿼리를 실행하고 결과를 확인할 수 있으며, 이제 RedisInsight는 RedisTimeSeries 쿼리 결과를 시각화할 수 있습니다.

RedisTimeSeries 1.6 정식 출시! 주요 신규 기능 완벽 정리

또한 RedisInsight에는 RedisTimeSeries를 대화형으로 학습할 수 있는 빠른 가이드와 튜토리얼이 포함되어 있습니다.

RedisTimeSeries 1.6 정식 출시! 주요 신규 기능 완벽 정리

RedisTimeSeries에 대해 더 자세히 알아보려면 redis.io와 developer.redis.com을 방문하세요.