作为程序员一定要保持良好的睡眠,才能好编程

redis中相关事务使用及锁的定义

发布时间:2019-03-03

redis事务相关命令:multi  exec  discard  watch   unwatch


Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:


事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

redis事务

watch 检查再设置 CAS行为 实现乐观锁。


做为watch命令的参数建会受到redis的兼容,redis能够检测受监视数据的变化,在执行exec命令之前,如果redis检测到至少一个键被修改了,按个整个事务终止运行。

然后执行exec命令会返回nui的一个值,提醒用户事务运行失败。


其实 watch有一个值被改变了,redis都不会进入事务。



watch key 可以一次性watch多个值,watch可以被调用多次,watch的值直到exec命令被调用之时为止。 或使用unwatch后解除。


redis事务.png



只要是 watch  监控起来的数据,有任意的改变,multi  事务都会失败,有一个值改变,也不会成功。




如果被看起来的数据,

客户端1:

watch  count


客户端2:

incr count  


会执行成功吗?  答案: 会的




那么在上面的基础上,我们执行了, 


multi  开启了事务


set news 123


exec 


这个事务会成功吗?


答案:否定的,不会成功的。





注意:


exec后所有被舰对空的建都会变为为受监控的状态,redis不管是不是否被终止。


当客户端连接被关闭时,所有的键都会变为未受监控的状态。



unwatch 不需要任何参数,这样便能清除所有受监控的键。





事务处理流程:


multi 后所有的操作将会放到一个队列里。



总结:在使用事务的时候,请一定要watch 否则会到造成数据不一致。




redis将会将一个事务中所有的命令序列化,然后按顺序执行,在一个redis事务中,redis要么执行其中所有命令,要么一行也不执行。




Redis 事务命令

下表列出了 redis 事务的相关命令:


序号 命令及描述

1 DISCARD 

取消事务,放弃执行事务块内的所有命令。

2 EXEC 

执行所有事务块内的命令。

3 MULTI 

标记一个事务块的开始。

4 UNWATCH 

取消 WATCH 命令对所有 key 的监视。

5 WATCH key [key ...] 

监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。