[アップデート]Amazon ElastiCacheにRedis5.0互換が追加されました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

おはようございます、加藤です。Amazon ElastiCache(以降、ElastiCache)にRedis5.0互換が追加されました!(え!?遅いですか?すいませんSTREAM型を事前に学習できておらず、ただアップデートだけ伝えるのもナーと思い触っていたら時間がかかってしまいました。)

New – Redis 5.0 Compatibility for Amazon ElastiCache | AWS News Blog

Redis 5.0の変更点

Redis5.0の変更の目玉であるStream型について一部ですが動作を説明していきます。

Stream

XADD コマンド

新しく追加された Stream というデータ型で、ユースケースとしては時系列系のログデータを格納する為に使用します。

redis-cliで動作を確認してみます。

Stream型の格納にはXADDを使用します。第一引数はキー名で第2引数はエントリーIDです。エントリーIDのフォーマットは<millisecondsTime>-<sequenceNumber>で下記のように*を指定している場合は自動生成されます。

> XADD key ID field string [field string ...]

データの格納XADD

redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XADD mystream * sensor-id 1234 temperature 19.8
"1542071255977-0"
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XADD mystream * sensor-id 1234 temperature 19.9
"1542071427704-0"
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XADD mystream * sensor-id 1234 temperature 19.7
"1542071433847-0"

#重複するエントリーIDでXADDするとerrorが返る
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XADD mystream 1542071433847-0 sensor-id 1234 temperature 0.0
(error) ERR The ID specified in XADD is equal or smaller than the target stream top item
#既存のストリームより小さいエントリーIDでXADDするとerrorが返る
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XADD mystream 1442071433847-1 sensor-id 1234 temperature 0.0
(error) ERR The ID specified in XADD is equal or smaller than the target stream top item
#sequenceNumberを変更してXADDした
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XADD mystream 1542071433847-1 sensor-id 1234 temperature 0.0
"1542071433847-1"

XRANGE, XREVRANGE コマンド

次に格納したデータを取り出しましょう、XRANGE,XREVRANGEコマンドを使用します。

XRANGE, XREVRANGEコマンドは指定した範囲内の値を返してくれます。全ての値を取得したい場合は、最小の値を意味する-と最大の値を意味する+を使用します。StartとEndを同じ値にすることも可能です。

> XRANGE key start end [COUNT count]
> XREVRANGE key end start [COUNT count]

範囲内の値の取り出しXRANGE

#全件取得
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XRANGE mystream - +
1) 1) "1542071255977-0"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.8"
2) 1) "1542071427704-0"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.9"
3) 1) "1542071433847-0"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.7"
4) 1) "1542071433847-1"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "0.0"

#範囲指定
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XRANGE mystream 1542071255977-0 1542071255978-0
1) 1) "1542071255977-0"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.8"

#範囲指定(同一値)
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XRANGE mystream 1542071433847-0 1542071433847-0
1) 1) "1542071433847-0"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.7"

#全件の内、先頭から2つ取得
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XRANGE mystream - + COUNT 2
1) 1) "1542071255977-0"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.8"
2) 1) "1542071427704-0"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.9"

範囲内の値の取り出しXREVRANGE

#全件取得
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XREVRANGE mystream + -
1) 1) "1542071433847-1"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "0.0"
2) 1) "1542071433847-0"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.7"
3) 1) "1542071427704-0"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.9"
4) 1) "1542071255977-0"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.8"

#全件の内、末尾から2つ取得
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XREVRANGE mystream + - COUNT 2
1) 1) "1542071433847-1"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "0.0"
2) 1) "1542071433847-0"
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.7"

XREAD コマンド

新しいストリームが到着するまでリッスンするには、XREADを使用します、XRANGEと比べてこちらはブロッキングが可能です。(あるXREADが実行中に他から読み取ることはできない)

オプションは3つあります。

  • COUNT
  • BLOCK
  • STREAMS
COUNT

ストリーム毎に読み取るデータの件数を指定します。2つのストリームに対してなら2✕2で4件取得します。

BLOCK

オプションとして使用することで、他からの読み込みをブロッキングします。ミリ秒でブロッキング時間の指定ができ0で指定すると永続的にブロッキングします。COUNTと併用した場合は、目標件数を読み込んだ後にブロッキングを解除します。

ブロッキング無しは、tailコマンドで、ブロッキング有りはtail -fと考えてください。指定した時間ストリームを取得するまで待機し続けます。

$というIDは現在Streamに格納されている最後のエントリーIDと同義です。つまり実行時以降に追加されたStreamを対象とするという意味です。

COUNTSTREAMは併用が可能ですが、その場合はCOUNTは1として扱われます。(ここ実は自信がないので訂正あればコメントにお願いします)

> XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]

新規項目の読み込みXREAD

redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XREAD STREAMS mystream 0
1) 1) "mystream"
   2)  1) 1) "1542071255977-0"
          2) 1) "sensor-id"
             2) "1234"
             3) "temperature"
             4) "19.8"
       2) 1) "1542071427704-0"
          2) 1) "sensor-id"
             2) "1234"
             3) "temperature"
             4) "19.9"
       3) 1) "1542071433847-0"
          2) 1) "sensor-id"
             2) "1234"
             3) "temperature"
             4) "19.7"
       4) 1) "1542071433847-1"
          2) 1) "sensor-id"
             2) "1234"
             3) "temperature"
             4) "0.0"

#全件の内、先頭から2つ取得
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XREAD COUNT 2 STREAMS mystream 0
1) 1) "mystream"
   2) 1) 1) "1542071255977-0"
         2) 1) "sensor-id"
            2) "1234"
            3) "temperature"
            4) "19.8"
      2) 1) "1542071427704-0"
         2) 1) "sensor-id"
            2) "1234"
            3) "temperature"
            4) "19.9"

# 1000msの間Streamに追加されるのを待ち所得する。取得できなかった場合はnil
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XREAD BLOCK 1000 STREAMS mystream $
(nil)
(1.12s)

# Streamに追加されるのを待ち所得する。
redis5.wm8scl.0001.apne1.cache.amazonaws.com:6379> XREAD BLOCK 0 STREAMS mystream $
1) 1) "mystream"
   2) 1) 1) "1542206055992-0"
         2) 1) "sensor-id"
            2) "1234"
            3) "temperature"
            4) "20.0"
(19.73s)

etc

他にもStream型に対して使用するコマンドはあります、下記URLでご確認頂ければと思います。 https://redis.io/commands/xack

あとがき

Stream型の用途としては、チャットシステムとして使用するという記載をよく見ます。あえて詳細を見ないで自分なりに他の仕組みと組み合わせて考えるという謎の遊びにハマっていますが、いずれはブログとして消化したいです。 以上、遅くなりましたがElastiCacheのアップデート情報でした。