Redis中,事务和Lua都是保证原子性的手段,当我们有多个命令要执行,希望他们以原子性方式执行的时候,就会考虑使用事务或者Lua脚本,那么他们之间有哪些区别呢?(看了很多资料,包括redis官网文档,几乎都没有提,以下内容是我基于自己的理解整理的,欢迎大家补偿)
事务和Lua都是可以保证原子性操作的,但是,这里说的原子性我们提过很多次,指的是不可拆分,不可中断的原子性操作。所以,需要注意的是,不管是Redis的事务还是Lua,都没办法回滚,一旦执行过程中有命令失败了,都是不支持回滚的。
但是,Redis的事务在执行过程中,如果有某一个命令失败了,是不影响后续命令的执行的,而Lua脚本中,如果执行过程中某个命令执行失败了,是会影响后续命令执行的。
在Redis的事务执行时,每一条命令都需要和Redis服务器进行一次交互,我们可以在Redis事务过程中,MULTI 和 EXEC 之间发送多个 Redis 命令给到Redis服务器,这些命令会被服务器缓存起来,但并不会立即执行。但是每一条命令的提交都需要进行一次网络交互。
而Lua脚本则不需要,只需要一次性的把整个脚本提交给Redis即可。网络交互比事务要少。
在 Redis 的事务中,事务内的命令都是独立执行的,并且在没有执行EXEC命令之前,命令是没有被真正执行的,所以后续命令是不会也不能依赖于前一个命令的结果的。
而在Lua 脚本中是可以依赖前一个命令的结果的,Lua 脚本中的多个命令是依次执行的,我们可以利用前一个命令的结果进行后续的处理。
借助Lua脚本,我们可以实现非常丰富的各种分支流程控制,以及各种运算相关操作。而Redis的事务本身是不支持这些操作的。