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とコネクションを張っておく必要があるということです。また今度この話を書こうと思います。