Redis的事物机制

168 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

前言

我们知道事物的ACID特性,在事务执行的执行的时候总要做到事务的原子性、一致性、持久性、隔离性,Redis也是有事务的,redis 的事务是基于一组命令的执行,redis的单条命令是原子性的,但是事务不是原子性的。对于事物的定义是一个完整的业务逻辑单于,要么全都是执行成功,要么全部都执行失败。

Redis的事务

Redis的事务所有的命令都是单独操作的,不会被其他命令所打断,所以事务之间也是相互隔离的。

事务相关指令

* Multi:事务开启,开启后所有的命令都会在命令的队列。
* exec:执行事务的所有命令,并且如果事务执行了watch命令,在watch监控的keys没有被修改的情况下,exec命令才能执行事务队列里的命令否则会直接放弃。
* DISCARD:事务取消,回滚事务中所有执行的命令。
* watch:监视一个或者多个key,在监视过程中如果监视的key被其他命令修改,则会将事务打断。
* unWatch:取消监视key。

一个简单的事务操作例子。

1D661EA2-5744-49DE-A379-302B52B0FD1E.png

这里我们看到在没有使用exec命令前,输入DISCARD命令进行事务的取消,前面的set命令被回滚了。

0150B707-1447-4671-9B7C-BDCD554AD84F.png

这里我在进行回滚是不行的,因为事务的已经被提交。

8741A086-CCA2-42DB-B565-38221BC82908.png

watch命令监视key

我们先通过watch命令监视name,然后给name设值。

49C80E99-87F0-45F8-AFF6-C3F2FD9A1A61.png

我们在开一个redis的客户端,来对name的值进行修改

1CBBC1BF-76AC-4FD4-9AB4-EC8A7A267B43.png

然后回头在执行exec事务,发现返回的是空,name的值已经被修改,真好符合watch命令监视的key如果被修改,那么整个事务都会被打断。

CEA909FA-518C-4523-B012-726414EAB7DE.png

总结

Redis事务的多条命令也是整个被打包一个事务,然后通过exec一次性的,有序执行,redis事务的队列也是满足FIFO先进进出的原则,并且事务在执行中正常情况下不会被中断,队列中的事务全部都执行完,事务才会结束。