2012-06-29 81 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脚本也是一样 - 它们不会互相阻塞。