-
Notifications
You must be signed in to change notification settings - Fork 65
/
Sentinel.pm
72 lines (48 loc) · 1.6 KB
/
Sentinel.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package Redis::Sentinel;
# ABSTRACT: Redis Sentinel interface
use warnings;
use strict;
use Carp;
use base qw(Redis);
sub new {
my ($class, %args) = @_;
# these args are not allowed when contacting a sentinel
delete @args{qw(sentinels service)};
$class->SUPER::new(%args);
}
sub get_service_address {
my ($self, $service) = @_;
my ($ip, $port) = $self->sentinel('get-master-addr-by-name', $service);
defined $ip
or return;
$ip eq 'IDONTKNOW'
and return $ip;
return "$ip:$port";
}
sub get_masters {
map { +{ @$_ }; } @{ shift->sentinel('masters') || [] };
}
1;
__END__
=head1 SYNOPSIS
my $sentinel = Redis::Sentinel->new( ... );
my $service_address = $sentinel->get_service_address('mymaster');
my @masters = $sentinel->get_masters;
=head1 DESCRIPTION
This is a subclass of the Redis module, specialized into connecting to a
Sentinel instance. Inherits from the C<Redis> package;
=head1 CONSTRUCTOR
=head2 new
See C<new> in L<Redis.pm>. All parameters are supported, except C<sentinels>
and C<service>, which are silently ignored.
=head1 METHODS
All the methods of the C<Redis> package are supported, plus the additional following methods:
=head2 get_service_address
Takes the name of a service as parameter, and returns either void (emptly list)
if the master couldn't be found, the string 'IDONTKNOW' if the service is in
the sentinel config but cannot be reached, or the string C<"$ip:$port"> if the
service were found.
=head2 get_masters
Returns a list of HashRefs representing all the master redis instances that
this sentinel monitors.
=cut