如果一个客户端仍然可以编辑密钥,那么在另一个客户端中使用MULTI和EXEC有什么用?再讨论1:多集名ABC再讨论2:集合名称XYZ再讨论1:执行name的最终值为ABC那么,当redis-cli 1中的事务仍在进行时,redis-cli 2仍可以更改时,在redis-cli 1中使用multi有什么意义呢?
krcsximq1#
在这种情况下,也就是说,用多执行运行单个命令,你不会得到任何好处。更糟糕的是,多执行会损害性能,因为你需要向Redis发送3个命令。多执行用于在一个事务中运行多个命令,尽管来自其他客户端的命令可能会与多执行命令混合。
client 1: multi client 1: set key value client 2: set key new-value client 1: set key2 another-value client 1: exec
Redis在收到exec命令之前不会运行客户端1的命令,所以Redis按照如下顺序运行这些命令:
exec
qaxu7uf22#
MULTI解决了两个问题。首先,它允许你原子地执行事情。你可以把几个命令排队,然后它们同时运行:
MULTI
127.0.0.1:6379> MULTI OK 127.0.0.1:6379(TX)> SET foo bar QUEUED 127.0.0.1:6379(TX)> SET baz qux QUEUED 127.0.0.1:6379(TX)> EXEC 1) OK 2) OK
这将在EXEC被调用时设置foo和baz。如果在命令排队时但在EXEC被调用之前有其他东西更改了foo或baz,那么这些更改将被覆盖。注意,要做到这一点,键需要在同一个shard上。如果你在集群环境中运行,还有其他的注意事项。但这是另一个更大的主题。MULTI的另一个用途是使用WATCH命令进行乐观锁定。您可以监视一个字段,如果其他人在事务期间更改了该字段,则事务将失败。
EXEC
foo
baz
WATCH
127.0.0.1:6379> WATCH foo OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379(TX)> SET foo bar QUEUED 127.0.0.1:6379(TX)> EXEC (nil)
这将在EXEC被调用时设置foo。如果在命令被排队时但在EXEC被调用之前有其他东西改变了foo,那么排队的命令将不会被执行,并且EXEC将返回(nil)。
(nil)
2条答案
按热度按时间krcsximq1#
在这种情况下,也就是说,用多执行运行单个命令,你不会得到任何好处。更糟糕的是,多执行会损害性能,因为你需要向Redis发送3个命令。
多执行用于在一个事务中运行多个命令,尽管来自其他客户端的命令可能会与多执行命令混合。
Redis在收到
exec
命令之前不会运行客户端1的命令,所以Redis按照如下顺序运行这些命令:qaxu7uf22#
MULTI
解决了两个问题。首先,它允许你原子地执行事情。你可以把几个命令排队,然后它们同时运行:
这将在
EXEC
被调用时设置foo
和baz
。如果在命令排队时但在EXEC
被调用之前有其他东西更改了foo
或baz
,那么这些更改将被覆盖。注意,要做到这一点,键需要在同一个shard上。如果你在集群环境中运行,还有其他的注意事项。但这是另一个更大的主题。
MULTI
的另一个用途是使用WATCH
命令进行乐观锁定。您可以监视一个字段,如果其他人在事务期间更改了该字段,则事务将失败。这将在
EXEC
被调用时设置foo
。如果在命令被排队时但在EXEC
被调用之前有其他东西改变了foo
,那么排队的命令将不会被执行,并且EXEC
将返回(nil)
。