node.jsとredisでpub/subをやってみたよ

前からやってみたかったredisのpub/subをnode.jsから使ってみました。
環境:OS X 10.7.5 / node.js 0.8.16 / npm 1.1.69 / redis 2.6.9

モジュールのインストール

$ npm install redis

redisをnode.jsから操作するのに必要なモジュール、redisをインストールします。
redisはコンパイルして起動させてある前提です。

コードを書く

pub/subをnode.jsから実行するためにコードを書きます。
大体以下のような感じになります。

channel.json
[
  "hoge channel",
  "hogehoge channel"
]
pub.js
var channel = require('./channel'),
    redis = require('redis'),
    client = redis.createClient(6379, 'localhost');

// 1秒おきにランダムにチャンネル名と数値を送信する
setInterval(function() {
  client.publish(
    channel[Math.floor(Math.random() * channel.length)],
    Math.random());
}, 1000);
sub.js
var channel = require('./channel'),
    redis = require('redis'),
    client = redis.createClient(6379, 'localhost');

// channel.jsonのチャンネル名をすべて登録
client.subscribe.apply(client, channel);

// 登録したチャンネルに対するイベントが発生した際に実行されるコールバック関数
client.on('message', function(channel, data) {
  console.log('%s: %s', channel, data);
});

実行してみる

$ node pub.js &
$ node sub.js

を実行するとチャンネル名と数値が1秒おきに出力されるかと!


リアルタイム通信みたいなものはやっぱり楽しいですね。
何かにこれを使えないかなーと思ってますけど、なかなか思いつかないところ。
唯一思いついたものといえばチャットくらい……
今までポーリングしていたところを置き換えられるのかも。


参考:
Redis の Pub/Sub を使って Node.js + WebSocket のスケールアウトを実現する方法 | dakatsuka's blog