1

我有一个简单的 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,结果:

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

2 回答 2

7

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

于 2012-06-29T12:19:18.613 回答
3

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

于 2015-07-11T07:04:46.280 回答