Rhythm & Biology

Engineering, Science, et al.

AnyEvent::Redisでpubsubを使ってみた

Redisはオンメモリで高速に動作しつつ、定期的にディスクに書き込んでくれるKVSです。
また、pubsubの機能もサポートされており、今回はこれに焦点をあててみようと思います。

もう少し詳しい内容は公式サイトのIntroductionを見てください。
http://redis.io/topics/introduction

今回はAnyEvent::Redisというモジュールを使いましたが、perlからredisを使うためのモジュールは他にもたくさんあります。

  • Redis
  • Redis::hiredis
  • AnyEvent::Hiredis

などなど。それぞれパフォーマンス面などちゃんと調べてみたいところです。

publish

"pub_test"というチャネルに"Hello World"というメッセージをpublishするコード。

# ae_redis_pub.pl
use strict;                                                                                         
use warnings;
use AnyEvent::Redis;

my $redis = AnyEvent::Redis->new(
  server => '127.0.0.1',
  port => 6379,
);

my $cv = $redis->publish("pub_test", "Hello World");
$cv->recv;

動作確認。

$ redis-server # Redisのサーバを立ち上げて
$ redis-cli subscribe "pub_test" # pub_testチャネルを購読するクライアントを立ち上げて
$ perl ae_redis_pub.pl # publish!

このようにすると、redis-cliの画面に"Hello World"が届けられます。

subscribe

"sub_test"というチャネルをsubscribeするコード。

# ae_redis_sub.pl
use strict;                                                                                         
use warnings;
use AnyEvent::Redis;

my $redis = AnyEvent::Redis->new(
  server => '127.0.0.1',
  port => 6379,
);

my $cv = $redis->subscribe("sub_test", sub {
  my ($message, $channel) = @_; 
  print "Received: $message [$channel].\n";
});
$cv->recv;

動作確認。

$ redis-server
$ perl ae_redis_sub.pl
$ redis-cli publish "sub_test" "Hello Subscriber"

このようにすると、ae_redis_sub.plの画面に"Hello Subscriber"が配達されます。

まとめ

この二つを組み合わせれば、簡単なチャットアプリがすぐに実装できますね。わざわざ自前でpubsubサーバを実装する必要もないです。
その際に気をつけるのは、少なくともAnyEvent::Redisに関しては、pubとsubで別々にredisとコネクションを張っておく必要があるということです。また今度この話を書こうと思います。