一、事务控制
1、简单事务控制
redis可以使用mult命令将之后的命令都存放在队列中,只有使用exec命令时才全部执行。
127.0.0.1:6379> multi OK 127.0.0.1:6379> set age 10 QUEUED 127.0.0.1:6379> set age 20 QUEUED 127.0.0.1:6379> exec 1) OK 2) OK 127.0.0.1:6379> get age "20"
如果我们打过几条命令发现有错,可以使用discard命令来进行回滚操作。
127.0.0.1:6379> multi OK 127.0.0.1:6379> set age 30 QUEUED 127.0.0.1:6379> set age 40 QUEUED 127.0.0.1:6379> discard OK 127.0.0.1:6379> get age "20"
2、乐观锁复杂事务控制
如果我们在事务控制的时候,我们想要改变的数据已经被改变了,这该怎么办呢?
127.0.0.1:6379> multi OK 127.0.0.1:6379> set age 14 QUEUED 127.0.0.1:6379> set age 16 QUEUED # 此时age已经改变 127.0.0.1:6379> exec 1) OK 2) OK 127.0.0.1:6379> get age "16"
可以看到,最后age还是进行了改变,如果我们想要不改变已经变更的数据,我们可以使用redis的乐观锁。
127.0.0.1:6379> watch age OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> set age 2 QUEUED 127.0.0.1:6379> set age 5 QUEUED # 此时age已经改变 127.0.0.1:6379> exec (nil)
可以看到,最终数据没有更改成功。
watch命令会监视给定的key,如果当exec时监视的key已经从watch之后发生了变化,则事务会失败。watch也可以监视多个key,如果连接断开,或者使用诸如exec、discard、unwatch等命令都会清除连接中的所有监视。