Redis stream


Intro


現在、会社はMSAを利用してプラットフォームを構築しています.内部通信はRedisのpublish subscribe機能を利用する.また,サービスごとにそれぞれのDBがあるので,データ共有のために一緒に利用することにした.Redisを使用するメリットは次のとおりです.
  • イベントは、1つのサービス上で発生し、複数のサービスがイベントに応答する必要がある場合、各サービス上で非同期に処理することができる.
  • データの統合を容易に管理できます.
  • inmemoryの利点を利用して、各サービスでデータを迅速かつ容易に共有します.
  • ログデータの管理が容易
  • 初めてRedisを見た人は、これがどういう意味なのか全然分かりません.私も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についても議論します.