NAME
AnyEvent::Redis2::Subscriber - event-driven Redis subscriber client
SYNOPSIS
use AnyEvent::Redis2::Subscriber;
my $subscriber = AnyEvent::Redis2::Subscriber->subscribe(
host => 'redis',
channel => 'z'
);
$subscriber->reg_cb(message => sub {
my ($subscriber, $message) = @_;
# ...
};
DESCRIPTION
This module is an AnyEvent user; you must use and run a supported event loop.
AnyEvent::Redis2::Subscriber is an event-driven (asynchronous) subscriber for the Redis publish/subscribe system.
The main idea is that other clients (such as AnyEvent::Redis2) publish messages to a specified channel (or class, in Redis-speak), which are then received by each client that has subscribed to the channel.
Unlike some other publish/subscribe mechanisms which are producer-consumer based, Redis' publish/subscribe mechanism is broadcast-based: every subscriber to a channel receives every message sent to that channel; and messages are not queued for future delivery if there are no subscribers for that channel.
Subscribing to a channel
To subscribe to a channel, call the subscribe() method:
my $subscriber = AnyEvent::Redis2::Subscriber->subscribe(
host => $host,
channel => $channel,
...
);
This immediately establishes a connection to the Redis server at the given host and subscribes to the specified channel.
Pattern-based subscriptions are also possible. Instead of specifying a channel
, a pattern
may be specified consisting of a glob pattern that matches channel names. For example, if chan_*
is specified, then the client will receive every message sent to "chan_1", "chan_2", "chan_zebra", and so forth while connected to the server:
my $subscriber = AnyEvent::Redis2::Subscriber->subscribe(
host => $host,
pattern => $pattern,
...
);
Optional arguments include:
- port => $port
-
Connect to the Redis server at
$port
. If undefined, the default port (6379) is used. - auth => $password
-
Authenticate to the server with the given password.
Receiving messages
To receive messages, register a callback for the message
event. When a message is received, the callback will be fired with the message and the channel it was received on:
$subscriber->reg_cb(message => sub {
my ($channel, $message) = @_;
print "Received message $message on channel $channel";
});
If you've subscribed to a channel pattern, you may also register a callback for the pmessage
event. When a message is received, the callback will be fired with the message, the channel it was received on, and the pattern:
$subscriber->reg_cb(pmessage => sub {
my ($pattern, $channel, $message) = @_;
print "Received message $message on channel $channel (pattern $pattern)";
});
Dealing with errors
To be notified of errors (which can occur at connect time or thereafter), register a callback with the error
event as follows:
$subscriber->reg_cb(error => sub {
my ($errmsg) = @_;
# ...
});
WARNING: As with all AnyEvent modules, you must not die() in a callback!
Unsubscribing
To unsubscribe, just undef the subscriber handle. Reusing handles for subsequent subscriptions (i.e., changing the channel) is not supported. Even though the wire protocol technically supports it, trust me, it's better this way :-).
SEE ALSO
AnyEvent::Redis2, Redis PublishSubscribe http://code.google.com/p/redis/wiki/PublishSubscribe
AUTHOR
Michael S. Fischer <michael+cpan@dynamine.net>
COPYRIGHT AND LICENSE
Copyright (C) 2010 Michael S. Fischer
This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.
See http://dev.perl.org/licenses/ for more information.