事务
1.事务的概念和原理
- Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis中的最小执行单位,一个事务中的命令要么都执行,要么都不执行。
- 事务的原理是先将属于一个事务的命令发送给Redis,然后在让Redis一次执行这些命令。
2. 事务相关命令
- MULTI
- 标记一个事务块的开始。 随后的指令将在执行EXEC时作为一个原子执行。
- Redis 的事务是不可嵌套的,当客户端已经处于事务状态,而客户端又再向服务器发送 MULTI
时,服务器只是简单地向客户端发送一个错误,然后继续等待其他命令的入队。 MULTI 命令
的发送不会造成整个事务失败,也不会修改事务队列中已有的数据。
- EXEC
- 执行事务中所有在排队等待的指令并将链接状态恢复到正常 当使用WATCH 时,只有当被监视的键没有被修改,且允许检查设定机制时,EXEC会被执行。
1.Redis保证一个事务中的所有命令要么被都不执行,要么都执行。
2.如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行;
3.一旦客户端发送了EXEC命令,所有的命令都会被执行,即使伺候客户端断线也没关系,因为Redis会记录所有要执行的命令。
WATCH
key [key …]
- 标记所有指定的key 被监视起来,在事务中有条件的执行(乐观锁)。
- 被监控的键一旦被修改或删除,之后的事务就不会执行。(须在multi之前执行)
- 监控一直会持续到EXEC命令。
- UNWATCH
- 取消一个事务中已被监视的所有key。
- 如果执行EXEC 或者DISCARD, 则不需要手动执行UNWATCH 。
DISCARD
- 命令用于取消一个事务,它清空客户端的整个事务队列,然后将客户端从事务状态
调整回非事务状态,最后返回字符串 OK 给客户端,说明事务已被取消。
3.在事务和非事务状态下执行命令的区别
无论在事务状态下,还是在非事务状态下,Redis 命令都由同一个函数执行,所以它们共享很多服务器一般设置,比如 AOF 的配置、 RDB 的配置,以及内存限制,等等。不过事务中的命令和普通命令在执行上还是有一点区别的,其中最重要的两点是:
- 非事务状态下的命令以单个命令为单位执行,前一个命令和后一个命令的客户端不一定是同一个; 而事务状态则是以一个事务为单位,执行事务队列中的所有命令:除非当前事务执行完毕,否则服务器不会中断事务,也不会执行其他客户端的其他命令。
- 在非事务状态下,执行命令所得的结果会立即被返回给客户端;而事务则是将所有命令的结果集合到回复队列,再作为 EXEC 命令的结果返回给客户端。