04
第 4 章

データ構造(応用編)

この章で学ぶこと
1Pub/Sub によるリアルタイムメッセージング
2Stream による永続的なイベント処理
3Redis 8 で統合された拡張データ構造
4HyperLogLog・Bitmap・Geospatial の概要
解説

Pub/Sub とは

Pub/Sub
メッセージを発行者から購読者へリアルタイムに配信する仕組み
パブリッシャー(発行者)
チャンネルにメッセージを送信する側
サブスクライバー(購読者)
チャンネルからメッセージを受け取る側
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
図解

Pub/Sub メッセージングモデル

パブリッシャーからチャンネルを経由してサブスクライバーへ配信される構造
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
コマンド

SUBSCRIBE / PUBLISH

$ SUBSCRIBE channel [channel ...]$ PUBLISH channel message
SUBSCRIBEチャンネルを購読する
PUBLISHチャンネルにメッセージを送信する
Ctrl+C購読を終了して redis-cli を抜ける
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
実演

Pub/Sub の実演

目的2 つのターミナルで Pub/Sub のメッセージ送受信を確認する
操作ターミナル 1 で SUBSCRIBE、ターミナル 2 で PUBLISH
確認する
ポイント
サブスクライバーがリアルタイムにメッセージを受信すること
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
コマンド

PSUBSCRIBE によるパターンマッチ購読

$ PSUBSCRIBE pattern [pattern ...]
PSUBSCRIBEパターンに一致するチャンネルをまとめて購読する
news.*news.sports、news.tech などすべて受信
Ctrl+C購読を終了して redis-cli を抜ける
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
実演

パターンマッチ購読の実演

目的PSUBSCRIBE でパターンに一致する複数チャンネルをまとめて購読できることを確認する
操作ターミナル 1 で PSUBSCRIBE news.*、ターミナル 2 で PUBLISH news.sports / PUBLISH news.tech
確認する
ポイント
パターンに一致するすべてのチャンネルのメッセージが届くこと
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

Pub/Sub の制約 — fire-and-forget

メッセージは保存されない
送信した瞬間に配信され、どこにも残らない
オフライン時のメッセージは消失
購読者が切断中のメッセージは受け取れない
確認応答がない
パブリッシャーは購読者が処理したかどうかを知れない
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

Stream とは

Stream
永続的なイベントログとしてメッセージを保持するデータ構造
追記専用
メッセージは時系列順に蓄積され、過去のメッセージも読み返せる
コンシューマーグループ
複数のコンシューマーでメッセージを分散処理できる
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
コマンド

Stream の基本コマンド

$ XADD key * field value [field value ...]$ XLEN key$ XRANGE key start end$ XREAD COUNT n STREAMS key id
XADDStream にメッセージを追加する(* は自動 ID 生成)
XLENStream 内のメッセージ件数を取得する
XRANGE範囲を指定して取得する(- は最古、+ は最新)
XREADStream から読み取る(0 で全件、$ で新着のみ)
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
実演

Stream 基本コマンドの実演

目的Stream へのメッセージ追加と読み取りを確認する
操作XADD でメッセージ追加 → XLEN で件数確認 → XRANGE で範囲取得 → XREAD で読み取り
確認する
ポイント
メッセージが永続的に保持され、複数の方法で読み返せること
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

コンシューマーグループの概念

コンシューマーグループ
同じ Stream を複数のコンシューマーで分担して処理する仕組み
メッセージの分配
各メッセージはグループ内の 1 つのコンシューマーだけに届く
確認応答(ACK)
処理完了を Redis に通知し、未処理メッセージを追跡できる
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
図解

コンシューマーグループの構造

Stream のメッセージが各ワーカーに分配され XACK で追跡する構造
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
コマンド

XGROUP CREATE / XREADGROUP / XACK

$ XGROUP CREATE key group id$ XREADGROUP GROUP group consumer COUNT n STREAMS key >$ XACK key group id [id ...]$ XPENDING key group
XGROUP CREATEコンシューマーグループを作成する
XREADGROUPグループとしてメッセージを読み取る
XACKメッセージの処理完了を通知する
XPENDING未 ACK のメッセージ一覧を確認する
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
実演

コンシューマーグループの実演

目的コンシューマーグループによるメッセージの分散処理と ACK を確認する
実行する
コマンド
$ XGROUP CREATE events mygroup 0$ XREADGROUP GROUP mygroup worker1 COUNT 1 STREAMS events >
確認する
ポイント
メッセージが異なるコンシューマーに分配されること
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
図解

Pub/Sub と Stream の比較

観点
Pub/Sub
Stream
メッセージの保持
保持しない
永続的に保持
再読み取り
不可
可能
コンシューマーグループ
なし
あり
確認応答
なし
XACK で可能
配信モデル
全員に配信
グループ内で分配
適した用途
リアルタイム通知
イベント処理・ジョブキュー
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
図解

Pub/Sub と Stream の構造比較

メッセージの保持・確認応答・配信モデルの違い
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

Redis 8 — Redis Stack の統合

Redis 8 の変更点
以前は別モジュールだった機能がコアに統合された
統合された主な機能
JSON、Search、TimeSeries、確率的データ構造(Bloom Filter 等)
新しいデータ構造
Vector Set(ベータ)
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

JSON データ構造

JSON データ構造
JSON ドキュメントをネイティブに格納・操作できる
JSONPath
ドキュメント内の特定のフィールドを直接取得・更新できる
String + JSON 文字列との違い
部分更新が可能、パース不要
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
コマンド

JSON.SET / JSON.GET

$ JSON.SET key path value$ JSON.GET key [path]
JSON.SETJSON ドキュメントを格納・更新する
JSON.GETJSON ドキュメントまたは特定パスの値を取得する
$ルート、$.name でフィールド指定
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
実演

JSON の実演

目的JSON ドキュメントの格納・取得・部分更新を確認する
実行する
コマンド
$ JSON.SET user:json:1 $ '{"name":"Alice","age":30}'$ JSON.GET user:json:1 $.name
確認する
ポイント
JSONPath による部分的な取得・更新ができること
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

Search(全文検索・インデックス)の概要

Search
Redis に格納されたデータに対して全文検索やフィルタリングを行う機能
インデックス作成
FT.CREATE でフィールドにインデックスを定義する
検索実行
FT.SEARCH でテキスト検索や数値範囲のフィルタリングを行う
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

TimeSeries の概要

TimeSeries
時系列データを効率的に格納・集計するデータ構造
自動集計
TS.CREATERULE で指定した間隔ごとに平均・最大・最小などを自動計算
保持期間
RETENTION で古いデータを自動的に削除できる
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

確率的データ構造の概要

Bloom Filter
要素が集合に「含まれないこと」を確実に判定できるフィルタ
Cuckoo Filter
Bloom Filter に似ているが、要素の削除もできる
その他
Count-Min Sketch(頻度推定)、Top-K(上位 K 件の追跡)、t-digest(パーセンタイル計算)
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

Vector Set の概要

Vector Set(ベータ)
ベクトル類似度検索をネイティブにサポートするデータ構造
HNSW アルゴリズム
高速な近似最近傍検索を実現する
用途
セマンティック検索、レコメンデーション、AI/ML ワークフロー
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

HyperLogLog とは

HyperLogLog
ユニークな要素の数(カーディナリティ)を推定するデータ構造
固定メモリ
要素数に関係なく約 12KB のメモリしか使わない
誤差
標準誤差 0.81% の近似値
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
コマンド

PFADD / PFCOUNT

$ PFADD key element [element ...]$ PFCOUNT key [key ...]$ PFMERGE destkey sourcekey [sourcekey ...]
PFADDHyperLogLog に要素を追加する
PFCOUNTユニークな要素の推定数を取得する
PFMERGE複数の HyperLogLog を統合する
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

Bitmap とは

Bitmap
String 型をビット列として扱い、ビット単位で操作するデータ構造
省メモリ
1 ビットで 1 つの真偽値を表現(1 億ユーザーでも約 12MB)
用途
ログイン状態、フラグ管理、日次アクティブユーザーの追跡
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
コマンド

SETBIT / GETBIT / BITCOUNT

$ SETBIT key offset value$ GETBIT key offset$ BITCOUNT key [start end]
SETBIT指定オフセットのビットを 0 または 1 に設定する
GETBIT指定オフセットのビットの値を取得する
BITCOUNT1 に設定されているビットの数を数える
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

Geospatial とは

Geospatial
緯度・経度の位置情報を格納し、距離や範囲で検索するデータ構造
内部構造
Sorted Set を基盤として、Geohash でエンコードした値をスコアに使う
用途
近くの店舗検索、配達可能エリアの判定
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
コマンド

GEOADD / GEOSEARCH

$ GEOADD key longitude latitude member$ GEOSEARCH key FROMMEMBER member BYRADIUS radius unit$ GEODIST key member1 member2 [unit]
GEOADD位置情報を追加する
GEOSEARCH指定メンバーから一定半径内の要素を検索する
GEODIST2 つのメンバー間の距離を計算する
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

Pub/Sub と Stream の使い分け

リアルタイム通知・ブロードキャスト
→ Pub/Sub
確実な処理が必要なイベント・ジョブキュー
→ Stream
判断基準
メッセージを失っても問題ないか、再処理が必要か
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
解説

Redis 8 統合機能と特殊データ構造の整理

JSON
JSON ドキュメントの部分操作
Search
フィールド内容での検索
TimeSeries
時系列データの格納と自動集計
確率的データ構造
省メモリでの存在チェック・頻度推定
HyperLogLog
ユニークカウントの推定(約 12KB 固定)
Bitmap
ビット単位のフラグ管理
Geospatial
位置情報の格納と範囲検索
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ
まとめ

この章のまとめ

Pub/Sub — fire-and-forget のリアルタイムメッセージング
Stream — 永続的なイベントログ、コンシューマーグループで分散処理
Redis 8 統合 — JSON、Search、TimeSeries、確率的データ構造がコアに統合
特殊データ構造 — HyperLogLog、Bitmap、Geospatial で省メモリ・高速な処理
次章: キー設計とメモリ管理
Pub/Sub
Stream
コンシューマーグループ
Redis 8 統合
JSON
特殊データ構造
まとめ