java面试题整理《redis篇》六

Redis事务提供了一种批量执行命令的方式,具备隔离性但不保证原子性。在事务中,命令序列化执行,遇到错误时,会执行已入队的正确命令。Redis通过WATCH命令实现乐观锁,监控key变化,若有变动则放弃事务。事务流程包括MULTI、EXEC和DISCARD。

Redis事务控制
Redis事务的本质是一组命令的集合,一次执行多个指令,事务中所有命令都被序列化,其他客户端提交的命令请求不会插入到事务执行命令序列中,简单来说:要不全执行,要不全不执行。Redis中提供了简单的事务功能,需要multi和exec两个命令实现。

事务执行流程:

开启事务(multi)
命令入队(…)
执行事务(exec)| 取消事务(discard)

在Redis的事务中的命令出现不同错误时,处理机制也会有所差异:

编译型异常(命令错误),事务中所有命令都不会执行,因为Redis没有隔离级别的概念,队列中的命令没有提交之前都不会实际的被执行。
运行时异常(1/0),如果事务队列中存在语法性错误,那么执行命令的时候,其它命令是可以正常执行的,错误命令抛出异常,由此看出Redis的单条命令保证原子性,但是事务并不保证原子性,不支持回滚功能。
Redis事务支持隔离性但不保证原子性:

Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完所有事务队列中的命令为止。因此,Redis 的事务是总是带有隔离性的。
Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。
通过事务实现上锁:
在有些应用场景需要在事务之前,确保事务中的key没有被其它客户端修改过,才执行事务,否则不执行,着类似于乐观锁的概念,在Redis中也提供了相关实现方法:

监视、加锁(watch)
取消监视、解锁(unwatch)
相关命令:

MULTI:开启一个事务,它总是返回OK。MULT执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不斜立即被执行,而是被放到个队列中,当EXEC命令被调用时,所有队列中的命令才会被执行。
EXEC:执行所有事务块内的命令。返回事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被返回空值null
DISCARD:客户端可以清空事务队列,并放弃执行事务,并且客户端会从事务状态中退出
WATCH:乐观锁,可以为Reds事务提供 check-and-set(CAS)行为,可以监控一个或多个键旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC命令
UNWATCH:可以取消wach对所有key的监控
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值