Redis stream
Intro
現在、会社はMSAを利用してプラットフォームを構築しています.内部通信はRedisのpublish subscribe機能を利用する.また,サービスごとにそれぞれのDBがあるので,データ共有のために一緒に利用することにした.Redisを使用するメリットは次のとおりです.
what is redis?
Redisは、データを格納するキー値構造のキャッシュシステムと見なすことができる.なぜこれを使うのでしょうか?DB(ディスク)にアクセスするコストが非常に高く、オペレーティングシステムが時間通りに居眠りをしている私も知っている常識です.しかし、メモリへのアクセスは非常に速い.redisはメモリに存在する小さなデータベースと考えられる.ただし、フィールドおよび値フォーマットを宣言する必要があるストレージRDSとは対照的に、テーブル宣言なしで使用できるため、NoSQLと呼ばれるリポジトリです.
さっきkeyvalue構造と言いましたが、valueの顔によって利用率や時間の複雑さは千差万別です.redisを導入する場合は、redisのホームページのデータ構造の説明を必ず精読することをお勧めします.
redis data structure
上の写真を見ると、いろいろな資料構造があることがわかります.
Hashes
を使用してデータ共有を行い、Publish機能を使用する場合はStreams
を使用します.(従来、redisのpub/subはStreamsとはあまり関係なかったが、Streamsを用いてメッセージキュー形式のpublishsubscribe構造を実現できることは、今では知るまでもない...)Stream
streamとは、Bit stream、datastreamなどのことで、時間が経つにつれてデータがどんどん入ってくる現象が考えられます.無限数列や級数をコンピュータで表現するのと似ています.私たちにとって、ログデータを考えるとStreamがどんな感じなのかがわかります.
RedisstreamsはRedis 5.0から新しいデータ構造として導入され、ログファイルをモデリングするために使用されます.
Do it!
$ brew install redis # 설치
$ brew services start redis # redis 실행
$ redis-cli # CLI 실행
追加データ:XADD
XADD key ID field value [field2 value2 ... ]
XADD customer * id 1234
ここではID部分が重要ですが、IDは以下の通りです.
< milliseconds time > - < sequence number >
これは、現在の時刻のtimestamp数字のような複数のデータが同じ時間に存在する可能性があるため、番号です.
*(astrict)は自動的にIDが付与されていることを示し、直接IDを宣言してもよい.
>>> 127.0.0.1:6379> XADD customer * id "asdfdasf"
>>> "1647231099585-0"
>>> 127.0.0.1:6379> XADD customer * id "asdfdasf"
>>> "1647231112587-0"
>>> 127.0.0.1:6379> xlen customer
>>> (integer) 2
データ読み出し:XREAD
XREAD [COUNT count][BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]
XREAD block 5000 STREAMS customer $
$にはいろいろな意味があります.jsonpath構文が使用されていることを示し、$123は123バイトが使用されていることを示し、ここでは新しく生成されたstreamsデータのみが受け入れられることを示します.
もともとXREAD block 5000 STREIMS customer
1526999644174-3
というようにIDを書いていたのですがとても面白くありませんだから私は$を使うと約束しました.これは後で発生したデータです.[현재 터미널]
>>> 127.0.0.1:6379> xread block 5000 streams customer $
[다른 터미널]
>>> 127.0.0.1:6379> xadd customer * id 124
>>> "1647231396280-0"
[다시 현재 터미널]
>>> 1) 1) "customer"
>>> 2) 1) 1) "1647231396280-0"
>>> 2) 1) "id"
>>> 2) "124"
データ消去:XDEL
XDEL key ID
XDEL customer 1647231396280-0
>>> 127.0.0.1:6379> xdel customer 1647231396280-0
>>> (integer) 1
複数のデータの削除:XTRIM
XTRIM key MAXLEN [~] count
XTRIM customer MAXLEN 10
データ消去中はADDまたはREADはできません.そのため、削除はできるだけ早くしなければならないので、短時間で削除することができます.上の意味は10個残して削除することです.
時間の複雑さ
XADD : O(log(N))
XREAD: O(log(N))
XDEL: O(log(N))
XTRIM: O(log(N))
Outro
どうせRedisはterminalでは使わないので、fastapiフレームワークで使いますが、PythonのRedislibraryをもっと活用すれば最高です.しかし、SQLがORMを利用できないことを知らないように、本来どのように設計された構造なのかを知ることが重要です.この文章では、RedisとStreamを理解しました.次の文章では、PythonでRedisについて議論します.時間があれば、Publish Subscribeについても議論します.
Reference
この問題について(Redis stream), 我々は、より多くの情報をここで見つけました https://velog.io/@ekzm8523/Redis-streamsテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol