使用 Lua 脚本实现 Redis 分布式事务

我们正在尝试设计一种跨多个 Redis 数据库的分布式事务。是否可以使用 Lua 脚本来实现?我们不想通过两阶段提交来实现,因为这可能会导致数据丢失。我们不能承受数据丢失。

示例场景:我有 3 个 Redis 数据库。我们需要更新所有 3 个库。更新可以是顺序的,但我们只有当所有三个都成功时才希望以成功结束事务。如果其中任何一个失败,我们应该能够回滚所有更新。

点赞
用户462242
用户462242

不,仅依靠 Lua 脚本在 Redis 实例之间实现分布式事务是不可能的,因为 Redis 不公开用于网络调用的库。然而,您可以使用 Lua 脚本作为解决方案的一部分来构建分布式事务(我使用 Lua 脚本在 Redis 服务器上实现了 Paxos)。

顺便说一句,在你的问题中,有一个关于 2PC 导致数据丢失的误解。 这是不可能发生的。 2PC 的教科书实现可能导致系统被阻塞,但不会导致数据丢失。 但即使是阻塞也不是问题,因为还有非阻塞版本的 2PC,例如 Google 的 Percolator 论文中的版本。

我创建了一个非阻塞 2PC 的可视化。 它可以帮助您了解它的各个组成部分。

2017-10-11 14:20:02