Redis Notifications
危険なほどのスピードで知られるRedisに、キーの変更や実行されたコマンドを通知する機能が追加されるようです。その名も “Notifications”。GitHubのnotificationsブランチに開発中のコードがあるとのことなので、少し遊んでみました。Notificationsの機能はまだ開発中のため、この記事では2013年1月26日時点の仕様について扱っています。ご注意ください。
機能を試すには自前でRedisをビルドする必要があるため、notificationsブランチのコードを取得してビルドします。Redisはmakeコマンドだけでビルドできるので楽ですね。
$ git clone git://github.com/antirez/redis.git
$ cd redis
$ git checkout -b notifications origin/notifications
$ make
ビルドが終わったら、srcディレクトリにできたバイナリからRedisを起動しましょう。起動時に "–notify-keyspace-events AKE" オプションを指定します。これで全てのコマンドのキーの変更と実行コマンドの通知を受け取ることができます。
$ cd src
$ ./redis-server --notify-keyspace-events AKE
キーの変更やコマンドの実行は、RedisのPub/Sub機能を利用して通知されるため、Redisを起動したらクライアントを立ち上げて、psubscribeコマンドを実行しておきます。これで通知を受け取る準備ができました。
$ redis-cli
redis 127.0.0.1:6379> psubscribe *
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "*"
3) (integer) 1
さらに別のクライアントを立ち上げて、コマンドをいくつか発行してキーを操作してみます。以下の例では"blog"というキーを操作しています。
$ redis-cli
redis 127.0.0.1:6379> SET blog SummerWind
OK
redis 127.0.0.1:6379> GET blog
"SummerWind"
psubscribeコマンドを実行しておいたクライアントの戻って確認すると、以下のように通知を受信していました。"__keyspace@0__“というprefixがついたチャンネルは、キーの変更を通知し、"__keyevent@0__“というprefix付きチャンネルは、実行されたコマンドが通知されています。
1) "pmessage"
2) "*"
3) "__keyspace@0__:blog"
4) "set"
1) "pmessage"
2) "*"
3) "__keyevent@0__:set"
4) "blog"
どの通知を受け取るかは、起動時に指定したオプションやRedisの設定ファイルで指定することができます。現時点で指定可能なオプションは、デフォルト設定ファイルのコメントに以下のように記載されていました。
# K Keyspace events, published with __keyspace@<db>__ prefix.
# E Keyevent events, published with __keyevent@<db>__ prefix.
# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
# $ String commands
# l List commands
# s Set commands
# h Hash commands
# z Sorted set commands
# x Expired events (events generated every time a key expires)
# e Evicted events (events generated when a key is evicted for maxmemory)
# A Alias for g$lshzxe, so that the "AKE" string means all the events.
そんなこんなでNotificationsの機能を試してみたわけですが、特定のキーを監視したり、キーのExpireを監視できたりして便利ですね。InboxのようなデータをRedis上で管理しておいて、新しいメッセージがきた時にNotificationsをトリガーにしてクライアントに通知、といった場面にも使えるんじゃないかなと思ったりしました。
ただ、Notificationsを有効にすると現時点ではRedisの性能が50%ほど低下するようだったので、機能が完成してもシステムに導入する前にはきちんと検証したほうがよさそうです。運用時を想定すると、スレーブで使うか、Redis 2.8で実装されるらしいClusterの機能と組み合わせることになるのかな。