Redis 事务阻塞了所有其他请求

5
阅读 Redis 事务文档时,有一件事我不太明白:
所有事务中的命令都是串行化并按顺序执行的。 在 Redis 事务执行期间永远不会发生另一个客户端发出的请求在执行过程中被服务,这保证了命令作为单个隔离操作执行。
从: https://redis.io/topics/transactions 粗体片段让我感到困惑。 这是否意味着,在一个请求中设置键 A 的值时,另一个想要为键 B 设置值的请求将被阻止,直到第一个请求完成?

1
是的 - 它的意思就是那个。 - Itamar Haber
这不会影响性能吗? - Marek M.
不一定,只要每个操作都很短就可以。 - Itamar Haber
1个回答

3
不,使用 MULTI 开始一个事务并不会阻塞其他并发连接到 Redis 的操作。

https://redis.io/topics/transactions#usage

Redis事务是通过MULTI命令进入的。该命令总是回复OK。此时,用户可以发出多个命令。相反地,Redis将把这些命令排队而不是执行它们。只有在调用EXEC命令时,所有命令才会被执行。
在事务中的命令会被收集,直到关闭事务。之后,这些命令将一次性执行,没有中断。这意味着其他连接仍然可以在提交之后执行它们的命令,而在关闭事务之前提交的命令之前。

1
那么在运行EXEC期间,这会变成一个阻塞操作?对吗? - Margach Chris
1
是的,运行EXEC会阻塞其他命令,因为Redis是单线程的,任何执行的命令在执行期间都应该阻塞其他命令。只是它们执行得非常快,因为所有东西都保存在内存中。而且运行单线程应用程序还可以避免在锁上创建同步开销,以避免并发修改。 - Simulant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接