在之前的文章中我们已经介绍了很多关于Redis中的命令,虽然命令的执行是原子性的,但是如果多条命令组合在一起则Redis就不能保证组合命令的原子性了。并且如果我们接触关系型数据库,那么我们一定会知道,在关系型数据库中提供了事务管理的功能,通过事务我们可以保证一组动作,要么全部成功,要么全部失败。在Redis中也提供了类似的功能,但Redis中的事务管理和关系型数据库中事务管理还是有区别的。下面我们详细介绍一下Redis中的事务管理。
在Redis中我们可以通过multi和exec两个命令来实现简单的事务管理。multi命令代表事务的开始,exec命令代表事务的结束,在使用时这两个命令之间执行的命令都是原子性的。下面我们看具体的使用。
![d4a2de5a9bd6469f6900e46c8ef698c5.png](https://i-blog.csdnimg.cn/blog_migrate/f95d7fc122e5251ce6382b41d512d225.jpeg)
我们看上图所示知道在使用Redis事务管理时,我们在multi和exec两个命令之间执行成功的命令,返回的结果是QUEUED的。这代表着命令并没有真正的执行,而暂时保存到Redis中。如果此时我们使用另一个客户端获取上图中key时,则返回的结果一定是0,因为命令并没有执行成功,也就是事务并没有提交。
![e97b9ead49a1aef08749392d9afe7569.png](https://i-blog.csdnimg.cn/blog_migrate/79afdd6958a63cabc6c5f2054b773958.jpeg)
只有当执行exec命令时,Redis中的事务才会提交。提交后我们在客户端执行刚刚的命令,则会获取到事务中执行成功的数据。
![a0c72e8dd916a5eb9793530c70cda0a9.png](https://i-blog.csdnimg.cn/blog_migrate/0561762f70cc9114b32c34a5e087bf4b.jpeg)
![487abb46142a36d32a1cff068db283a7.png](https://i-blog.csdnimg.cn/blog_migrate/4266fd98a4445d6b9f5a1566d7594b2c.jpeg)
如果我们想要停止事务,则可以使用discard命令。
![b0cbc012e6fe68fab405b93617498ace.png](https://i-blog.csdnimg.cn/blog_migrate/4637b89f93fa8efe8ea0a8a32eece527.jpeg)
下面我们介绍一下在使用Redis事务时的注意事项。
- 命令错误:如果我们在使用事务时,如果执行命令有错误,则会造成事务无法提交。
- 运行时错误:如果我们在事务中执行的命令本身没有语法错误时,例如将sadd命令写成了zadd命令,这种就是运行时错误了。这种错误Redis会成功的将事务提交,所以遇到这种错误时,需要开发人员自行处理了。
在某些业务中,为了确保事务中的key没有被其它客户端修改过,才提交事务,否则不执行类似乐观锁一样。在Redis中我们可以watch命令来解决这类问题。下面我们看一下具体操作。
- 客户端一:
![7eb00cfcb594146df37b463ce81c83c1.png](https://i-blog.csdnimg.cn/blog_migrate/df14864c7fd47d01f38070cbdda21a95.jpeg)
客户端二:
![3c27497186bb01e5850438de9ee7642b.png](https://i-blog.csdnimg.cn/blog_migrate/60fd06a9addc7059f03c68df6b436eed.jpeg)
这就是Redis中事务管理的功能,它和传统的关系型数据库中的事务相比,Redis中事务管理要简单的多,因为关系型数据库中的事务支持很多复杂的逻辑计算,并且支持回滚功能。而Redis中事务管理不支持上述功能。这也是它们之间的主要区别。