Jedis源码解析(Transation事务)

本文深入探讨Redis中事务(transaction)的实现原理,包括MULTI和EXEC命令的作用,以及Transaction类的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 Redis Client中Transaction如何实现

Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行。Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXEC 命令表示事务命令结束。其原理流程如下:

这里写图片描述

实现案例:

这里写图片描述

2 Transaction类的结构

我草勒,竟然与Pipeline类继承相同的父类(MultiKeyPipelineBase)、实现相同的接口(Closeable)!
这里写图片描述

3 Transaction的实现过程

先上代码:起一个事务,插入一个string和一个hash
这里写图片描述
所以其过程在形式上与原理流程是一一对应的。
这里写图片描述

(1) MULTI

Pipeline一样,Transaction也是BinaryJedis的成员变量,获取Transaction的实例直接通过其multi()方法
这里写图片描述
在返回Transaction对象之前,multi()方法还干了两件事情,不对严格意义上讲就是一件事情那就是想redis server发送“MULTI”命令,只不过其实现放在两个方法中
这里写图片描述
在Client的multi()中send multi command,同时修改状态标志位,此时redis server没有接收到multi的命令,命令仍然在outputstream中
这里写图片描述
接下来就是flush outputstream了
这里写图片描述
好的流程的第一步实现了,第二步就直接跳过吧!

(2) EXEC
好的,下面就是三个关键的点!
这里写图片描述

1)getMany()的方法将第二步中的所有命令flush,这与PipeLine的思想是完全一样的!

这里写图片描述

2)exec()方法就是send EXEC command,但是依旧没有flush

这里写图片描述

3)不用急,flush在这里getObjectMultiBulkReply

这里写图片描述

那么再来总结一下Jedis的Transaction流程吧

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值