Jedis 最简单的例子分析

时间:2023-02-09 17:30:06

作为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源码理解的错误,谢谢