为了保持数据的正确性,我们需要了解当其他客户端正在处理相同的数据时,如果我们不小心,可能会导致数据损坏。在本节中,我们将讨论使用 Redis 事务来防止数据损坏,并在某些情况下提高性能。
Redis 中的事务与更传统的数据库中的事务不同。在关系数据库中,我们可以告诉数据库服务器 BEGIN,此时我们可以执行各种读取和写入操作,这些操作彼此之间保持一致,之后我们可以运行 COMMIT 来使我们的更改永久生效,或者运行 ROLLBACK 来放弃我们的更改。
在 Redis 中,有一种简单的方法可以处理一系列彼此保持一致的读取和写入操作。我们通过调用特殊命令 MULTI 开始我们的事务,传递我们的一系列命令,然后是 EXEC(如第 3.7.2 节中所介绍的)。问题在于,这个简单的事务实际上在调用 EXEC 之前不会执行任何操作,这意味着在我们可能需要数据之前,我们无法使用读取的数据来做出决策。这可能看起来并不重要,但有一类问题由于无法以一致的方式读取数据,或者不允许事务在应该成功时失败(例如,当我们在使用两阶段提交针对单个对象进行 MULTI 个同时事务时,这是解决该问题的常用方法)而变得难以解决。其中一个问题是从市场购买商品的过程。让我们看一个实际的例子。
使用 MULTI/EXEC 延迟执行可以提高性能由于在使用 MULTI/ EXEC 时,Redis 会延迟命令的执行直到调用 EXEC,因此许多客户端(包括我们正在使用的 Python 客户端)甚至会延迟发送命令,直到所有命令都已知。当所有命令都已知时,客户端将同时发送 MULTI,然后是要执行的一系列命令和 EXEC。然后,客户端将等待接收来自所有命令的所有回复。这种一次发送多个命令并等待所有回复的方法通常被称为流水线,并且可以通过减少客户端需要等待的网络往返次数来提高 Redis 执行多个命令时的性能。
在过去的几个月里,Fake Game Company 的基于 Web 的 RPG 游戏在 YouTwitFace(一个虚构的社交网络)上取得了重大增长。因为它关注其社区的需求和愿望,它确定玩家需要能够在市场上买卖物品。我们的工作是设计和构建一个可以扩展以满足社区需求的市场。