我是Redis的新手,在官方网站上阅读其交易时,我对此感到困惑。
要么处理所有命令,要么处理所有命令,因此Redis事务也是原子的。
即使命令失败,也会处理队列中的所有其他命令 -
所以它反对彼此,不是吗?
答案 0 :(得分:3)
这是关于不同的事情。 Redis有管道 - 客户端可以立即向redis发送许多命令。管道批次内部可以是交易。
当事务失败时,事务中的所有命令都将被丢弃,但是EXEC
命令之后的任何管道(排队)命令都将被执行。
有关详细信息,请参阅http://redis.io/topics/pipelining和http://redis.io/topics/transactions。
答案 1 :(得分:1)
简单地说,Redis TRANSACTION拥有一个事务应该具有的任何功能,除了它在故障期间无法回滚。因为redis的作者认为故障中的回滚功能是不必要的,所以故障只能由编程错误引起。
也许我应该提到你,multi
系列命令实现的redis事务不是一个好的选择,因为它是一种很好的函数(作者认为Lua是一个更好的方法并使{{1完全没必要)。使用redis Lua要好得多!
来自redis作者的引用:
根据定义,Redis脚本是事务性的,因此您可以使用Redis事务执行所有操作,也可以使用脚本执行操作,通常脚本将更简单,更快速。 这种重复是因为在Redis 2.6中引入了脚本,而事务早就存在了。但是,我们不太可能在短时间内删除对事务的支持,因为即使不使用Redis脚本,它仍然可以避免竞争条件,特别是因为Redis事务的实现复杂性很小,因此在语义上似乎是合适的。 然而,在不久的将来,我们将看到整个用户群只是使用脚本并非不可能。如果发生这种情况,我们可能会弃用并最终删除交易。
你应该好好看看Lua chapter of Redis Documentation。它确实是一个更好,更强大的解决方案,除非你需要了解一些Lua。
如果您需要了解更多
,请回复答案 2 :(得分:0)
已处理命令与失败之间存在差异。在SQL中,如果任何命令失败,则会回滚整个事务,就好像它们都没有完成一样。在redis中,命令失败不会阻止其他命令的处理或处理,每个命令都会独立失败或成功。
因此,如果您增加一个计数器,然后尝试将一个不同的键设置为一个值,它会失败,增量仍然会发生并且不会回滚。因此,即使一个命令失败,所有命令都处理。