Redis事务的概念:
Redis事务就是将一系列命令包装成一个队列,在执行时候按照添加的顺序依次执行,中间不会被打断或者干扰,在执行事务中,其他客户端提交的命令不可以插入到执行事务的队列中,简单来说Redis事务就是一次性、顺序性、排他性的执行一些列命令。
Redis事务的特点:
- Redis事务不保证原子性,Redis中单个命令是原子性的,但是Redis事务不保证原子性,且不会回滚,当一组命令中有某个命令执行失败后,后续的命令会继续执行。
- Redis事务单独的隔离操作,事务中的所有命令都会序列化、按顺序执行,在执行过程中,不会被其他的客户端发送的命令插入。
- 没有隔离级别的概念,队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行,事务开始执行后,其他客户端的命令也无法插入。
- Redis事务中命令格式错误不会执行,但是如果格式正确,但是运行错误(例如list进行incr操作),最终正常的命令会正常执行,发生错误的不执行,这个时候就要处理数据一致性的问题了。
Redis事务的主要作用就是串联多个命令防止别的命令插队。
Redis事务常用命令:
命令 | 描述 |
---|---|
multi | 开启事务命令,后续命令依次进入队列 |
exec | 执行事务,如果被监听的key没有被修改,就执行事务,否则回滚 |
discard | 取消事务,发生在mulit之后exec之前,执行该命令后,不能再继续执行exec命令了 |
watch key1 [key2 …] | 用于监视一个或多个key,如果在事务执行之前,key被其他命令所改动,那么事务将被打断 |
unwatch key1 [key2 …] | 取消 WATCH 命令对所有 key 的监视 |
Redis事务的执行步骤:
- 开启事务:mulit,执行此命令后,开启Redis事务,后续的所有指令都添加到事务中。
- 命令入队:将所有的命令加入队列。
- 执行事务:exec,执行此命令后,事务开始执行,Redis依次开始执行队列中的命令,其他命令不可插队或打断了。
- exec,执行此命令后,事务开始执行,Redis依次开始执行队列中的命令,其他命令不可插队或打断了。
图例:
watch命令:
- watch命令是一个乐观锁,他可以在执行事务之前监控Redis中任务数量的key,并在执行exec的时候,检查这些key是否被修改过,如果修改过,事务就会拒绝执行。
- 用来判断事务执行是否安全,在执行multi命令之前,先执行watch key1 key2 …命令,对目标key进行监视,最后在执行exec命令事,Redis会检查这些key否打开了REDIS_DIRTY_CAS标识,如果打开,则事务可以正常执行,否则事务会拒绝执行。
unwatch的命令:
取消watch命令监视的key,如果再执行unwatch命令之前,已经执行了exec或者discard命令,那就无需执行unwatch命令了。
Redis事务的使用场景:
- 用户命令打包,批量操作的场景,以此来减少Redis服务器的通讯次数。
- 多个命令需要顺序操作的时候,因为Redis事务中的命令是顺序执行的。
总体来说Redis事务在实际业务中使用较少,且Redis事务不支持回滚,需要谨慎使用。
如有不正确的地方请各位指出纠正。