Redis中的事务管理

在之前的文章中我们已经介绍了很多关于Redis中的命令,虽然命令的执行是原子性的,但是如果多条命令组合在一起则Redis就不能保证组合命令的原子性了。并且如果我们接触关系型数据库,那么我们一定会知道,在关系型数据库中提供了事务管理的功能,通过事务我们可以保证一组动作,要么全部成功,要么全部失败。在Redis中也提供了类似的功能,但Redis中的事务管理和关系型数据库中事务管理还是有区别的。下面我们详细介绍一下Redis中的事务管理。


在Redis中我们可以通过multi和exec两个命令来实现简单的事务管理。multi命令代表事务的开始,exec命令代表事务的结束,在使用时这两个命令之间执行的命令都是原子性的。下面我们看具体的使用。

img

我们看上图所示知道在使用Redis事务管理时,我们在multi和exec两个命令之间执行成功的命令,返回的结果是QUEUED的。这代表着命令并没有真正的执行,而暂时保存到Redis中。如果此时我们使用另一个客户端获取上图中key时,则返回的结果一定是0,因为命令并没有执行成功,也就是事务并没有提交。

img

只有当执行exec命令时,Redis中的事务才会提交。提交后我们在客户端执行刚刚的命令,则会获取到事务中执行成功的数据。

img
img

如果我们想要停止事务,则可以使用discard命令。

img

下面我们介绍一下在使用Redis事务时的注意事项。

  • 命令错误:如果我们在使用事务时,如果执行命令有错误,则会造成事务无法提交。
  • 运行时错误:如果我们在事务中执行的命令本身没有语法错误时,例如将sadd命令写成了zadd命令,这种就是运行时错误了。这种错误Redis会成功的将事务提交,所以遇到这种错误时,需要开发人员自行处理了。

在某些业务中,为了确保事务中的key没有被其它客户端修改过,才提交事务,否则不执行类似乐观锁一样。在Redis中我们可以watch命令来解决这类问题。下面我们看一下具体操作。

  • 客户端一:

客户端二:

这就是Redis中事务管理的功能,它和传统的关系型数据库中的事务相比,Redis中事务管理要简单的多,因为关系型数据库中的事务支持很多复杂的逻辑计算,并且支持回滚功能。而Redis中事务管理不支持上述功能。这也是它们之间的主要区别。

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧