我认为Redis的事务是一个很不完善的功能,甚至和“事务”的概念都不搭边,这里讲解Redis事务只是说它有这个东西,我想大概没有人在生产中用这个东西。
我们知道Mysql事务满足ACID特性,即原子性、一致性、隔离性、持久性,但是Redis事务并不满足ACID特性,如果Redis事务中的一条命令执行失败它会继续执行任务而且不会回滚。Redis事务实际上更像是打包好的批量脚本执行。
Redis事务涉及到以下命令的使用:
命令 | 作用 |
---|---|
multi |
标记一个事务块的开始。 |
exec |
执行所有事务块内的命令。 |
discard |
取消事务,放弃执行事务块内的所有命令。 |
watch key [key ...] |
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
unwatch |
取消 WATCH 命令对所有 key 的监视。 |
先看一个比较正常的执行流程:使用multi
命令和exec
命令批量执行命令。

那么watch命令是怎么用的呢?假设有个string类型的变量a为1,接下来要开启一个事务,事务内依赖变量a,如果变量a发生了变化则可能导致事务执行结果异常,这时候就要"watch" a ,防止在事务执行的过程中有其他客户端改变了a的值;如果发现a的值发生了变化,就要停止事务的执行:

discard命令是可以在事务内执行的命令,执行后会退出事务。

好了,redis事务比较简单,由于其功能并不完善,所以建议别用。
END.
注意:本文归作者所有,未经作者允许,不得转载