転載:https : //blog.csdn.net/enmotech/article/details/81230531
軽微な変更を加える
ありがとう!
まとめ
Redis Streamの特別な機能は何ですか?kafkaとの類似点と相違点は何ですか?それをよりよく使うには?この記事の著者はこれについて多くの研究を行っており、読んだ後では、多くの利益を得たと感じています。
コンテンツの概要
Redis5.0は最近作者によって突然リリースされ、多くの新機能が追加されています。Redis5.0の最大の新機能は、マルチキャストをサポートする新しい強力で耐久性のあるメッセージキューであるデータ構造Streamの追加です。著者は、Redis StreamがKafkaの設計に大きく依存していることを認めています。
Redis Streamの構造を上の図に示します。リンクされたメッセージのリストがあり、結合されたすべてのメッセージが接続されています。各メッセージには一意のIDと対応するコンテンツがあります。メッセージは永続的であり、Redisの再起動後もコンテンツはそのまま残ります。
各ストリームには一意の名前があります。これはRedis キーです。これは、最初にxadd
命令を使用してメッセージを追加するときに自動的に作成されます。
各Streamは複数のコンシューマグループをハングさせることができ、各コンシューマグループはStream配列上で前方に移動するカーソルlast_delivered_id
を持ち、現在のコンシューマグループによってどのメッセージが消費されたかを示します。各コンシューマグループは、ストリーム内で一意の名前を持っています。コンシューマグループは自動的には作成されません。別の命令で作成する必要xgroup create
があります。ストリームの特定のメッセージIDが消費を開始することを指定する必要があります。このIDは、last_delivered_id
変数を初期化するために使用されます。
各消費者グループのステータスは独立しており、互いに影響を受けません。つまり、Streamの同じ内部メッセージが各コンシューマーグループによって消費されます。
同じコンシューマグループ(コンシューマグループ)は複数のコンシューマ(コンシューマ)を接続でき、これらのコンシューマは競争関係にあります。コンシューマがメッセージを読み取ると、カーソルlast_delivered_id
が前方に移動します。各コンシューマはグループ内で一意の名前を持っています。
コンシューマの内部には状態変数があり、クライアントによって読み取られたpending_ids
現在のメッセージを記録しますが、まだ確認応答はありません。クライアントにackがない場合、この変数のメッセージIDは増加します。メッセージがackされると、減少し始めます。この変数は、Redisの公式でpending_idsと呼ばれPEL
ている、Pending Entries List
これは非常にコアデータ構造である、少なくとも消費メッセージたら、そのクライアントを確実にするために使用されていない治療の途中で伝送ネットワークを失うことなく、。
メッセージID
メッセージIDの形式は、timestampInMillis-sequence
たとえば1527846880572-5
、現在のメッセージ1527846880572
がミリメートルタイムスタンプで生成されたことを示し、ミリ秒以内に生成された5番目のメッセージです。メッセージIDはサーバーによって自動的に生成されるか、クライアント自体によって指定されますが、フォームはである必要があり整数-整数
、後で追加されるメッセージのIDは前のメッセージのIDよりも大きい必要があります。
メッセージ内容
メッセージの内容はキーと値のペアで、ハッシュ構造の形式のキーと値のペアは特別なものではありません。
追加、削除、変更
-
xadd追加メッセージ
-
xdelはメッセージを削除します。ここでの削除はフラグビットを設定するだけで、メッセージの全長には影響しません
-
xrangeはメッセージリストを取得し、削除されたメッセージを自動的にフィルタリングします
-
xlenメッセージ長
-
del deleteストリーム
# *号表示服务器自动生成ID,后面顺序跟着一堆key/value
127.0.0.1:6379> xadd codehole * name laoqian age 30 # 名字叫laoqian,年龄30岁
1527849609889-0 # 生成的消息ID
127.0.0.1:6379> xadd codehole * name xiaoyu age 29
1527849629172-0
127.0.0.1:6379> xadd codehole * name xiaoqian age 1
1527849637634-0
127.0.0.1:6379> xlen codehole
(integer) 3
127.0.0.1:6379> xrange codehole - + # -表示最小值, +表示最大值
127.0.0.1:6379> xrange codehole - +
1) 1) 1527849609889-0
2) 1) "name"
2) "laoqian"
3) "age"
4) "30"
2) 1) 1527849629172-0
2) 1) "name"
2) "xiaoyu"
3) "age"
4) "29"
3) 1) 1527849637634-0
2) 1) "name"
2) "xiaoqian"
3) "age"
4) "1"
127.0.0.1:6379> xrange codehole 1527849629172-0 + # 指定最小消息ID的列表
1) 1) 1527849629172-0
2) 1) "name"
2) "xiaoyu"
3) "age"
4) "29"
2) 1) 1527849637634-0
2) 1) "name"
2) "xiaoqian"
3) "age"
4) "1"
127.0.0.1:6379> xrange codehole - 1527849629172-0 # 指定最大消息ID的列表
1) 1) 1527849609889-0
2) 1) "name"
2) "laoqian"
3) "age"
4) "30"
2) 1) 1527849629172-0
2) 1) "name"
2) "xiaoyu"
3) "age"
4) "29"
127.0.0.1:6379> xdel codehole 1527849609889-0
(integer) 1
127.0.0.1:6379> xlen codehole # 长度不受影响
(integer) 3
127.0.0.1:6379> xrange codehole - + # 被删除的消息没了
1) 1) 1527849629172-0
2) 1) "name"
2) "xiaoyu"
3) "age"
4) "29"
2) 1) 1527849637634-0
2) 1) "name"
2) "xiaoqian"
3) "age"
4) "1"
127.0.0.1:6379> del codehole # 删除整个Stream
(integer) 1