Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

RedisTimeSeries 1.6正式リリース!新機能と性能改善を徹底解説

本日、RedisTimeSeries 1.6の一般提供(GA)開始をお知らせできることを嬉しく思います。この記事では、新たに利用可能になった主要な新機能について詳しく紹介します。

RedisTimeSeriesとは

RedisTimeSeriesは、Redis向けの高性能なメモリファースト型の時系列データ構造です。マルチテナンシー(多数の時系列を同時に保持できる)に対応しており、複数のクライアントがこれらの時系列へ同時にアクセスすることも可能です。現在では、Redis Stackの一部としても提供されています。

RedisTimeSeries 1.6の主な新機能

  • クエリ機能の強化
    • 時系列をまたいだ集計(クロス時系列集計)
    • タイムスタンプやサンプル値による結果のフィルタリング
    • 取得するラベルの選択
    • 集計バケットのアラインメント
    • サンプルの削除
  • パフォーマンスの向上
  • キースペース通知
  • Redis on Flashに対するRedis Enterpriseサポート

クエリ機能の強化

時系列をまたいだ集計(クロス時系列集計)

バージョン1.6以前では、実行できる集計は次の一種類のみでした。

  • 単一の時系列に対して、等間隔の時間枠ごとにサンプルを集計する。

バージョン1.6からは、以下の2種類の新しい集計が可能になりました。

  • 複数の時系列に対して、同一のタイムスタンプを持つサンプルを、時系列の集合全体で集計する。
  • 複数の時系列に対して、まず各時系列を等間隔の時間枠ごとに集計し、その後、各時間枠の結果を時系列の集合全体で集計する。

それでは、最初の新しい集計タイプを見てみましょう。まず2つの銘柄を作成し、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でサポートされています。その他のフィルタリング句も利用可能です(詳細はドキュメントを参照してください)。

続いて、2番目の新しい集計タイプを見てみましょう。

まず、2つの銘柄を作成し、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

集計バケットのアラインメント

1日の平均気温を取得したいけれど、「1日」の始まりが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」に設定することで、その時刻にALIGNを合わせることも可能です。

redis:6379> TS.RANGE stock:A 5 + ALIGN - 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」に設定することで、その時刻にALIGNを合わせることもできます。

サンプルの削除

TS.DELを使用すると、指定した時系列から、2つのタイムスタンプ間のサンプルを削除できます。

例えば、TS.DEL stock:A 1020 1050は、タイムスタンプ1020から1050まで(両端を含む)のすべてのサンプルを削除します。戻り値は削除されたサンプルの数です。

パフォーマンスの向上

多くの最適化が実装され、ほとんどのクエリはRedisTimeSeries 1.4と比較してはるかに高速に実行されるようになりました。

次の表は、単一ノードで達成可能なTSBSクエリ(詳細はこちらで説明しています)の1秒あたりのクエリ数を示したものです。表には、バージョン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と比較すると、1秒あたりのクエリ数は8%〜65%向上していることがわかります。

キースペース通知

Redisキースペース通知により、RedisクライアントはPub/Subチャネルを購読し、Redisデータセットに何らかの影響を与えるイベントを受信できるようになります。例えば、RedisGearsと組み合わせれば、これらの通知をトリガーに関数を実行できます。

一例として、サンプルのストリームをリッスンし、リアルタイムの予測や警告を生成する時系列予測器や異常検知器を実装することが可能です。さまざまなRedisTimeSeriesコマンドを購読してイベントを生成するテストなども参考にしてください。

Redis on Flashに対するRedis Enterpriseサポート

バージョン1.6以降、RedisTimeSeriesはRedis on Flash上でも動作します。ただし重要な点として、RoFはキーレベルで実装されているため、時系列全体の値は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をご覧ください。

  1. RedisTimeSeriesで金融アプリケーションを構築する方法:株価とテクニカル指標の時系列データ管理

    投資家は、大きく分けて2つのタイプに分類できます。ファンダメンタル投資家は、企業のビジネスモデル、売上高、利益、キャッシュフロー、現在のバリュエーション(評価額)、リスク、成長見通しなどの基本的な指標をもとに、その企業へ投資すべきかどうかを判断します。ウォーレン・バフェットは、徹底したファンダメンタル分析によって割安な企業を見つけ出し、世界有数の富豪として名を馳せました。 一方で、テクニカル投資家は企業のファンダメンタルズにはほとんど、あるいはまったく注目せず、数百に及ぶテクニカル指標から買い・売り・保有のシグナルを導き出すことに集中します。こうしたテクニカル投資家は、日次・週次・月次の単位

  2. テレビでNetflixの音ズレが発生する原因と対処法まとめ【Samsung・Apple TV・Roku・TiVo対応】

    Netflix(ネットフリックス)は、お気に入りのドラマや映画を楽しめる人気のOTT配信サービスです。しかし、スマートテレビでNetflixを視聴する際に、映像と音声がずれる「音ズレ」に悩まされることがあります。これは多くのユーザーが経験するよくあるトラブルで、いくつかの対処法を実践することで解決できます。 本記事では、Samsung Smart TVをはじめ、Apple TV、Roku、TiVoなど各デバイスでNetflixの音ズレを解消する方法を詳しくご紹介します。ぜひ最後までお読みください。 スマートテレビでNetflixの音ズレが起こる主な原因 Samsung Smart TVやA