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 では、同じように使用しようとしていた Redis の代わりに、Tarantool NoSQL データベースを使用しています。Tarantool では、すべてのコマンドが別のファイバーで実行され、別のファイバーをブロックしません。Lua スクリプトも同じです。相互にブロックしません。

于 2015-07-11T07:04:46.280 に答える