1. jkr_2255

    Posted

    jkr_2255
Changes in title
+Redisのpub/sub機能
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,20 @@
+RedisはNoSQLのデータストアとして有名ですが、もう1つの機能として、「pub/sub機能」を持っています。もはやSQLと比較するような機能ですらないのですが、軽くまとめてみます。
+
+## pub/subとは
+JavaScriptをやっているとイメージしやすいと思うのですが、`onclick`に直接イベントを書いてしまうとイベントが1つしか設定できなくなってしまいます。
+
+一方で、`addEventListener`を使えば複数イベントをセットできますし、イベントをトリガする側ではイベントがいくつついているかも気にせずに、まとめて発生させることができます。このようにして、「イベントを起こす側」と「イベント処理を行う側」を分離するのがpub/subモデルです。
+
+## Redisでのpub/sub
+まず、受信側が`SUBSCRIBE チャンネル名`というコマンドをRedisに投げます。ふつうのRedisコマンドは、繋いで結果が帰ってきたらそれで終わりですが、`SUBSCRIBE`コマンドは一度発行するとRedisにつながったままとなります(この状態では`SUBSCRIBE`と関係ない他のコマンドを投げるべきではない、とのことです)。
+
+このままの状態で、別のクライアントから`PUBLISH チャンネル名 内容`とすると、`SUBSCRIBE`しているクライアントにデータが届きます。例えば[`node-redis`](https://github.com/NodeRedis/node_redis)では`.on('message')`で届いたものを受け取ることができます。
+
+もちろん、おなじRedisサーバにつなげればpub/subはプロセスや言語の壁を超えて自由に行なえますので、多言語・プロセスな環境下で要素をつなぐのにもピッタリです。
+
+## 注意点
+* `SUBSCRIBE`側では他の命令を流すのが適当でないという都合上、接続プールに巻き込まれないように注意する必要があります(`PUBLISH`側は特に問題ありません)。
+* `SUBSCRIBE`側は非同期で来るメッセージを受け取れる構造である必要があります(Node,jsや別スレッドで処理するなど)。PHPで処理するのはややこしいかもしれません。
+* 即時のメッセージ配信のため、誰も`SUBSCRIBE`していなければ`PUBLISH`は闇に消えてしまいます(送ること自体は可能です)。
+* Redisのデータベースにある、(`SELECT`で選ぶ)データベース番号は、pub/subには**影響しません**。同じサーバで複数のpub/subを行う場合、(データベース番号ではなく)チャンネル名を変える必要があります。
+