2012-06-29 74 views
0

我有一個簡單的Lua腳本:爲什麼lua腳本阻止redis-server?

while (i < 500000) do 
    redis.call("zadd", 'test1', i, i) 
    redis.call("expire", 'test1', 600) 
    i = i + 1 
end 

local res = redis.call("zrange", "test1", 0, 500000) 

for k,a in pairs(res) do 
    redis.call("zadd", 'test2',k,a) 
end 

爲什麼這個腳本攔截Redis的服務器? 如果我在另一個控制檯命令運行,例如:設定試驗1,結果是:

BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE. 

回答

6

Redis的是單線程。每個命令都會阻止它。 EVAL也是一個命令,因此它阻止redis。

3

這就是爲什麼我們在Mail.Ru和myMail使用Tarantool NoSQL數據庫而不是Redis,我們也嘗試使用它。在Tar​​antool中,每個命令都在單獨的光纖中執行,並且不會阻塞另一個命令。 Lua腳本也是一樣 - 它們不會互相阻塞。