我编写了以下程序(redis.pl
),Redis使用默认端口设置在本地运行,但当我使用redis.pl
运行morbo redis.pl
时,我从未获得********* 1
屏幕。这是为什么?似乎订阅从未发生过。我该如何解决这个问题?
#!/usr/bin/perl
use v5.18;
use warnings;
use Mojolicious::Lite;
use Mojo::Redis2;
say "Welcome";
my $redis = Mojo::Redis2->new();
$redis->subscribe(['pubsub'] => sub {
say "********* 1";
});
get '/' => sub {
my $self = shift;
$self->render(json => {a => 1});
};
app->start;
答案 0 :(得分:2)
我目前没有安装redis实例,但我认为这应该可行。
#!/usr/bin/perl
use v5.18;
use warnings;
use Mojolicious::Lite;
use Mojo::Redis2;
say "Welcome";
helper redis => sub {state $redis = Mojo::Redis2->new()};
app->redis->subscribe(['pubsub'] => sub {
say "********* 1";
});
get '/' => sub {
my $self = shift;
$self->render(json => {a => 1});
};
app->start;
我怀疑一旦redis实例超出范围,就会丢失它及其连接。
答案 1 :(得分:0)
我解决了这个问题,确保将$redis->subscribe
的返回值保留在永久变量中,如下所示:
而不是......
$redis->subscribe(['pubsub'] => sub {
say "********* 1";
});
......我写了......
our $subscription = $redis->subscribe(['pubsub'] => sub {
say "********* 1";
});
解决了这个问题。我猜它与AnyEvent
类似,返回值必须保持活跃状态。