2014-03-03 336 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