【问题标题】:Redis pipeliningRedis 流水线
【发布时间】:2014-04-04 06:18:41
【问题描述】:

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

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;

【问题讨论】:

    标签: perl redis


    【解决方案1】:

    documentation 表示您需要添加一个 coderef 作为set 的第三个参数。

    要使用流水线,请将 coderef 参数添加为命令方法调用的最后一个参数

    这会把你的例子变成:

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

    您实际上可以对回复做一些事情,而不是空子:

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

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

    警告:这些命令与流水线结合时的行为仍在讨论中,您现在不应该同时使用它们。

    【讨论】:

    • 但我感觉您已经阅读了所有这些内容并正在寻找其他内容。
    • Tnx 回复,是的,我读过这个,看起来有点混乱。所以它建议在管道衬里时应该删除事务。另一件困扰我的事情how long is pipeline and should I worry about it?
    • 那个链接答案很有趣。不过,不确定您要做什么。听起来您只需要小心一次输入多少数据。但我相信这在很大程度上取决于盒子的力量。他们正在谈论 6MB 的数据。根据我的设置,即使在内部通过网络发送也几乎没有。所以我会说我们必须看看你的任务的情况。但我同意,它说你不应该做交易。无论如何,管道与事务非常相似,不是吗?不同之处在于收集命令的位置。
    • 我已经安排了填充新值的作业,我想通过使用管道来加速它。有资源支持这一点,但我不想阻塞 redis 或其他东西。
    • 听起来很合理。你需要交易吗?也许对这两种解决方案都进行基准测试。
    猜你喜欢
    • 2017-03-24
    • 2018-02-09
    • 2013-07-12
    • 2012-05-17
    • 2015-06-02
    • 2019-01-22
    • 2019-03-22
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多