分布式缓存redis之事务

关系型数据库的事务具备:原子性(A)、一致性(C)、隔离性(I)、持久性(D)。在redis中也同样拥有事务的概念

redis事务的使用

redis中与事务相关的命令有5个,分别是:MULTI EXEC DISCARD WATCH UNWATCH

1)MULTI命令用于开启事务

开启事务后,可以开始对键执行操作,能看到开启事务后命令的返回都是”QUEUED”,Redis Server收到这些命令后将他们保存在队列中,只有收到EXEC命令才会真正执行。


2)EXEC命令:当在exec之前使用watch命令的话,只有被watch的key没有被修改的情况下,exec命令才真正执行,exec的返回结果是一个Array结构的数据,其中每个元素是事务中顺序执行的命令的结果

3)当执行了MULTI命令和一些操作后,想放弃当前事务,可以使用DISCARD命令,DISCARD命令会清空事务命令队列,并退出事务(注意discard并不是rollback回滚)。

4)watch命令:监控一个或者多个key,如果这些key在提交事务exec之前被其他用户修改过,那么事务执行失败,需要重新获取最新数据从头操作,使得redis事务具有check-and-set语义,watch命令如下:



上述命令中:Client1对count使用WATCH命令后开启事务,在执行EXEC命令前,Client2修改了count的值,Client1执行EXEC命令会失败。

5)unwatch:取消WATCH命令对所有key的监控,所有监控锁将会被取消。

redis事务的特性

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

2:没有隔离级别的概念:队列中的命令在事务没有被提交之前不会被实际执行

3: 不保证原子性:redis中的一个事务中如果存在命令执行失败,那么其他命令依然会被执行(比如出现下面的错误类型二),没有回滚机制


在第五条命令中我随便打了几个字符,提交事务的时候并没有成功,这也很符合我们对事务的理解。从图中可以看到错误命令在我输入的时候就已经报错了,也就是说这条错误命令在进入队列的时候redis就已经知道这是一条错误命令,这样,整个事务的命令将全部失败,那么,有没有一种可能某个错误指令在进入队列的时候redis还没有发现他的错误呢?比如:



这就是我们上面提到的第二类错误,对于一个存在问题的命令,如果在入队的时候就已经知道其出错,整个事务内的命令将都不会被执行(其后续的命令依然可以入队),如果这个错误命令在入队的时候并没有报错,而是在执行的时候出错了,那么redis默认跳过这个命令执行后续命令。也就是说,redis只实现了部分事务(并不能保证事务的原子性)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值