2014-03-03 172 views
2

我想在填充数据库时利用客户端流水线。我如何使用perl Redis client来实现这个目标?Redis流水线

use Redis; 

my $redis = Redis->new or die "No redis server"; 

$redis->multi; 
for my $i (1 .. 20000) { 

    $redis->set("key.$i" => "foo" x500); 
} 
$redis->exec; 

回答

1

documentation说,你需要一个CODEREF添加到作为第三个参数来set

要使用流水线,加CODEREF参数作为最后一个参数的命令方法调用

那会变成你的例子为:

for my $i (1 .. 20000) { 
    $redis->set("key.$i" => "foo" x500, sub {}); 
} 

相反,空分,你实际上可以做些回复:

您提供给流水线命令方法的coderef是调用一次 响应可用。它有两个参数,$回复和$错误。 如果定义了$ error,则它包含由Redis服务器发送的 错误回复的文本。否则,$回复是非错误回复。对于几乎 的所有命令,这意味着它是undef,或者是一个已定义但非引用的标量,或者是其中任何一个的数组ref;但请参阅“键”,“信息”和 “exec”。

它还说,在文档的transaction handling部分:

警告:这些命令的行为时,与流水线结合仍在讨论中,并且,你不能在同一时间使用它们只是现在。

+0

但我有这种感觉,你已经阅读了所有这些,并寻找其他的东西。 – simbabque

+0

Tnx的回复,是的,我读过这个,它看起来有点混乱。所以这表明在管道铺设时应该放弃交易。另一件困扰我的事情[管道多长时间,我应该担心它](http://stackoverflow.com/a/16710211/223226)? –

+0

该链接的答案是非常有趣的。不知道你在做什么。听起来你只需要小心一次输入多少数据。但我相信它很大程度上取决于盒子的力量。他们正在谈论6MB的数据。就我的设置而言,即使在内部通过网络发送也几乎没有。所以我会说我们必须看看你的任务的情况。但我同意,它说你不应该做交易。无论如何,管道与交易非常相似,不是吗?区别在于收集命令的位置。 – simbabque