2015-09-26 61 views
0

我是Redis的新手,在阅读官方网站上的交易时,我非常困惑。Redis交易原子

  1. 它说

要么所有的命令,或不进行处理,所以一个Redis的交易也是原子。

  • 于是说
  • 即使当命令失败,在队列中的所有其它命令被处理 -

    所以它互相反对,不是吗?

    回答

    3

    这是关于不同的事情。 Redis有管道 - 客户端可以一次发送很多命令到redis。管道批次内部可以是交易。 而且当事务失败时,一个事务中的所有命令都将被丢弃,但是在执行了EXEC命令之后的任何流水线(排队)命令都将被执行。

    欲了解更多信息,请参阅http://redis.io/topics/pipelininghttp://redis.io/topics/transactions

    0

    处理后的命令与失败之间存在差异。在SQL中,如果任何命令失败整个事务回滚,它就好像没有完成。在redis中,命令失败并不妨碍其他命令的处理或处理,每个失败或独立成功。

    所以,如果您增加一个计数器,然后尝试设置一个不同的键值并失败,增量仍然发生,不会回滚。因此所有命令都是处理即使一个失败。

    0

    简而言之,Redis TRANSACTION拥有事务应具有的任何功能,除非它在失败期间无法回滚。因为redis的作者认为失败时的回滚函数是不必要的,所以只能由编程错误导致失败。

    也许我应该提一下,通过multi系列命令实现的redis事务并不是一个好的选择,因为它是一种obselete函数(作者认为Lua是一种更好的方法,并且使得multi完全没有必要)。使用redis Lua好得多!从Redis的作者

    报价:

    一个Redis的脚本是事务性的定义,所以一切都可以用Redis的交易做的,你也可以做一个脚本,通常脚本会更简单,更快。 这种重复是由于在Redis 2.6中引入了脚本,事实早已存在。然而,我们不可能在短时间内取消对交易的支持,因为即使不采用Redis脚本编制,仍然可以避免竞争状况,尤其是因为Redis交易的实施复杂性很小,所以它在语义上似乎是恰当的。 然而,在不远的将来,我们会发现整个用户群只是使用脚本并不是不可能的。如果发生这种情况,我们可能会弃用并最终删除交易。

    你应该看看Lua chapter of Redis Documentation。这确实是一个更好更强大的解决方案,除了要求你知道一些Lua。

    回复如果您需要了解更多