0.1redis事务
Redis中的事务是一组命令的集合,至少是两个或两个以上的命令,redis事务保证这些命令被执行时中间不会被任何其他操作打断,没有回滚的概念。
multi:标记一个事务的开始。事务内的多条命令会按照先后顺序被放进一个队列当中。
exec:执行所有事务块内的命令。
返回值:事务内的所有执行语句内容,事务被打断(影响)返回nil
discard:取消事务,放弃执行事务块内的所有命令。
watch key [key...]:监视一个(或多个)key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断。
unwatch:取消WATCH命令对所有key的监视。如果在执行Watch命令之后,EXEC命令或DISCARD命令先被执行了的话,那么就不再需要执行UNWATCH了。
0.2事务例子
(1)正常执行事务:首先开启事务,其次向事务队列中加入命令,最后执行事务提交
multi:用multi命令告诉Reis,接下来要执行的命令你先不要执行。而是把它们存起来(开启事务)
sadd works jojn 第一条命令进入等待队列(命令入队)
sadd works rose 第二条命令进入等待队列(命令入队)
exec 告知redis执行前面发送的两条命令(提交事务)
(2)事务执行exec之前,入队命令错误(语法错误;严重错误致服务器不能正常工作(例如内存不足)),放弃事务
MULTI正常命令
SET key value 正常命令
INCR 命令语法错误
EXEC 无法执行事务,那么第一条正确的命令也不会执行,所以key的值不会设置成功
(3)事务执行exec命令后,执行队列命令,命令执行错误,事务提交
MULTI 正常命令
SET username zhangsan 正常命令
Ipop username 正常命令,语法没有错误,执行命令才会有错误
exec 正常执行,发现错误可以在事务提交前放弃事务,执行discard
(4)放弃事务
MULTI 开启事务
SET age 25 命令入队
SET age 30 命令入队
DISCARD 放弃事务,则命令队列不会被执行
0.3Redis的watch机制
(1)Redis的watch机制原理:使用watch监视一个或多个key,跟踪key的value修改情况,如果有key的value值在事务exec执行之前被修改了,整个事务被取消。
注意:使用watch监视了一个带过期时间的键,那么即使这个键过期了,事务仍然可以正常执行
(2)何时取消key的监视(watch)?:当事务被提交或执行unwatch,监控自动被取消