Redis Stream #1
Nov 1 · 4 min read
Redis Streamについて調べた+多分使用する(使用すべき)なので忘れないうちに記載する。
概要
- 概念的にはエントリを追加できるリスト
- かくエントリには一位のIDと値をもつ
- IDはデフォルト生成され、タイムスタンプが含まれる
- 値はハッシュ値
- 範囲内にクエリを行なったり、ブロックコマンドを使用して着信のたびにエントリを読み取ったりすることができる。
- Streamは履歴を保持するメッセージブローカー、メッセージキュー、総合ログ、チャットシステムの構築に適している。
- Redis Streamはメッセージを永続的に保持する。
- クライアントのグループが協働することを可能にするコンシューマーグループという機能が実装されている。
→グループ内のコンシューマーは、ID別に項目を検索したり、項目の処理を確認したり、また保留中のメッセージの所有者を主張したりすることができる。
Command
・XADD(エントリの追加)
>XADD teststream * sensor-id 1234 temperature 10.8
1518951480106-0・XLEN(エントリ件数の確認)
>XLEN teststream
(integer)1・XRANGE(エントリの取得)
- firstとlastのエントリIDを指定して範囲検索ができる。
- また特別な記号として-が最小、+が最大を表す
→それらを指定すれば全て取得できる - エントリIDをハイフンで分割した際の左側の時間情報だけでも指定できる。
→その場合はSequence Numberは最初と最後でいい感じに引っ掛ける - COUNTオプションもある。SQLで言う所のLIMIT
> XRANGE mystream 1518951480106 1518951480107
1) 1) 1518951480106-0
2) 1) "sensor-id"
2) "1234"
3) "temperature"
4) "19.8"> XRANGE mystream - +
1) 1) 1518951480106-0
2) 1) "sensor-id"
2) "1234"
3) "temperature"
4) "19.8"
2) 1) 1518951482479-0
2) 1) "sensor-id"
2) "9999"
3) "temperature"
4) "18.2"> XRANGE mystream - + COUNT 2
1) 1) 1519073278252-0
2) 1) "foo"
2) "value_1"
2) 1) 1519073279157-0
2) 1) "foo"
2) “value_2"
・ XREAD( tail -fやpub/subのsub的な読み込み)
- ブロッキングリストやpub/subモデルとは似ているが異なるもの。
- コンシューマーグループごとに一貫した操作ができる
- COUNTオプションは必須ではない
- STREAMSオプションは必須
→STREAMSオプションの引数はストリームキーおよび読み出し済み - 最後のエントリIDが続く
- 読み出し最後のエントリIDを保持し、それをこのコマンドでSTREAMSオプションとして指定すれば、それより新しいエントリが読みだせる
- STREAMSオプションは最後し指定しないといけない
> XREAD COUNT 2 STREAMS mystream 0
1) 1) "mystream"
2) 1) 1) 1519073278252-0
2) 1) "foo"
2) "value_1"
2) 1) 1519073279157-0
2) 1) "foo"
2) "value_2"> XREAD STREAMS mystream otherstream 0 0
(略)
上記はノンブロッキングモードで、できることが範囲検索と変わらないが、XREADはブロッキングモードを指定できる。
BLOCKオプションで指定でき、その引数はタイムアウトのミリ秒。0は無制限を表す。
$と言う特別な記号が最後のエントリIDを表すらしい。もちろん普通のエントリIDも指定可能
→動作的にはtail -f
