为什么lua脚本阻止redis-server?

时间:2012-06-29 12:17:22

标签: lua redis

我有一个简单的Lua脚本:

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服务器? 如果我在另一个控制台命令中运行,例如:set test 1,result:

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

2 个答案:

答案 0 :(得分:6)

Redis是单线程的。每个命令都阻止它。 EVAL也是一个命令,因此它会阻止redis。

答案 1 :(得分:3)

这就是为什么我们在Mail.Ru和myMail使用Tarantool NoSQL数据库而不是我们也试图使用的Redis。在Tar​​antool中,每个命令都在一个单独的光纤中执行,并且不会阻止另一个命令。 Lua脚本也是一样 - 它们不会相互阻塞。