作为redis在工作中实际的使用者,我打算深入学习下redis,但是因为redis是用c写的,本人是个java程序员,所以打算先从分析jedis入手 逐步深入了解redis的使用等
Jedis 是java语言封装的 用来操作redis的第三方库
地址是:https://github.com/xetorthio/jedis
后面的分析都是基于 jedis 2.7.2 分析的
首先 如果我们要在maven项目中使用 jedis需要配置如下
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.2</version>
</dependency>
其次 我们看一下 jedis作为客户端操作redis的最简单的例子
Jedis jedis = new Jedis("127.0.0.1");
jedis.set("key", "value");
String value = jedis.get("key");
System.out.println(value);
1. 我们需要构建Jedis实例,构造函数可以只写 ip地址, 端口则使用默认值端口6379,超时时间默认使用2000ms
注意此时我们的程序并没有和redis-server建立连接通道
2.执行 jedis.set(key,value) 方法,执行步骤如下:
a.通过方法(isInMulti())检查当前是否为多命令模式,如果当前是在多命令模式下则抛出异常
"Cannot use Jedis when in Multi. Please use JedisTransaction instead."b.如果上面的检查通过,则调用client.set(final String key,final String value) 方法,其中client是 BinaryClient的子类
在 set方法中 会首先调用SafeEncoder类的encode方法对 传入的 key和string进行编码,编码的方式很简单 就是 将字符串转换为字节,其中转换的字符编码为 "utf-8"
然后会调用Connection的sendCommand 方法进行操作,在这个方法里面 才会真正开始调用Connection类的connect()方法,根据之前的host和port 对redis-server进行连接
紧接着会进入Protocol类的sendCommand方法,在这个方法里面会根据redis的协议格式 将相关的命令和内容通过RedisOutputStream写给redis-server ,关于redis通讯的协议部分以后会专门写个文章进行整理
在命令写入成功之后,会将Connection的piplinedCommands 属性自增一,表示在管道中已经有一个命令了
最后 会在set方法中调用 client.getStatusCodeReply 方法,该方法的作用是执行 RedisOutputStream 的 flush 方法,将 通道缓冲区中命令发送给redis-server,然后会将 piplinedCommands 自减一,表示已经有一个命令发送给 redis-server了,紧接着 Protocol类会根据协议从 inputstream中获取相关的返回值信息,如果信息不为空,则通过 SafeEncoder 类对字节数组编码为string后返回给调用放,这个返回的信息就是命令执行的成功还是失败等。
3 执行 jedis.get(key) 方法,
该方法基本与上面个的方法执行步骤一致,只是最后在获取服务器返回值的时候,上面的方面是 调用 client.getStatusCodeReply() 获取执行命令的返回结果
而对于 jedis.get()这种需要服务器返回具体信息的命令,是调用 client.getBulkReply()方法 获取返回的信息
这是我第一次写博客 ,作为我的学习笔记, 后面我会尽量每天记录一点学习redis获得的心得,欢迎大家拍砖,指出我对于jedis源码理解的错误,谢谢