redis 将MULTI与多个重新分类一起使用

r8uurelv  于 2022-10-31  发布在  Redis
关注(0)|答案(2)|浏览(150)

如果一个客户端仍然可以编辑密钥,那么在另一个客户端中使用MULTI和EXEC有什么用?
再讨论1:多集名ABC
再讨论2:集合名称XYZ
再讨论1:执行
name的最终值为ABC
那么,当redis-cli 1中的事务仍在进行时,redis-cli 2仍可以更改时,在redis-cli 1中使用multi有什么意义呢?

krcsximq

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按照如下顺序运行这些命令:

  1. Redis收到客户端1发来的MULTI命令,并开始对客户端1的命令进行排队
  2. Redis从客户端2运行命令,即set key new-value
  3. Redis从客户端1接收EXEC命令,并运行MULTI和EXEC之间的所有命令。
qaxu7uf2

qaxu7uf22#

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被调用时设置foobaz。如果在命令排队时但在EXEC被调用之前有其他东西更改了foobaz,那么这些更改将被覆盖。
注意,要做到这一点,键需要在同一个shard上。如果你在集群环境中运行,还有其他的注意事项。但这是另一个更大的主题。
MULTI的另一个用途是使用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)

相关问题