Redis 通过multi discard exec 和watch 四个命令实现事物的功能。使用方法如下:
首先使用multi 方法打开事物,然后进行后续的增删改操作。修改完成后,使用exec 将事物提交。或者使用discard 方法取消事物。
一个事物从开始到执行会经历以下三个阶段:
1.开始事物
2.命令入列
3.执行事物
第一阶段: redis从非事物状态变为事物状态
第二阶段:当redis不是事物状态时,服务器收到来自客户端的命令时,会将命令立即执行。当redis处于事物状态时,首先会将命令存入一个事物队列中,然后返回queued 表示已存入队列。事物队列的底层实现是一个数据,每个数组项都包含三个属性:
1.要执行的命令 2.命令的参数 3.参数的个数
第三阶段:执行事物,当所有命令被执行后,将执行结果返回给客户端,redis从事物状态返回到非事物状态。
事物执行特性:
1.事物会以一个事物为单位执行队列中所有命令,除非当前事物执行完毕,不然不会中断事物,也不会执行其他客户端的命令
2.事物中多条命令会集合到回复队列,在作为命令结果返回给客户端。
Watch 在开始事物之前 watch 一个或多个key 当watch命令执行后key值发生修改,exec时,事物不再执行,直接返回失败。
原子性: redis单个指令是原子性的,但是事物并不是,当redis执行事物执行到一半被关闭进程时,事物执行失败,redis不会回滚或者继续执行。
持久性: redis 事物只是把命令放入一个队列中,没有提供额外持久性功能。持久化跟redis使用的持久化模式相关。不能保证持久性。