jedis的源码理解-基础篇

【jedis的源码理解-基础篇】【http://my.oschina.net/u/944165/blog/127998】
(关注实现关键功能的类)
 
基于jedis 2.2.0-SNAPSHOT
        首先是对输入输出Stream进行了包装生成出两个类redis.clients.util.RedisOutputStream 和 redis.clients.util.RedisInputStream。这两个类极大的简化了IO操作的操作。 

    redis.clients.util.RedisInputStream 
    根据redis协议的特点提供了 
    1. 按位读 public byte readByte() 
    2. 按行读 public String readLine() 
    3. 按偏移量读 public int read(byte[] b, int off, int len) 
    以上操作基本满足了对流的解析工作。 

    redis.clients.util.RedisOutputStream 
    根据redis协议的特点提供了 
    1. 将一个整型转化为对应的ascii流输出,并加入换行回车。其实对应的就是按行写入 public void writeIntCrLf(int value) 
    2. 写入一位 public void write(final byte b) 
    3. 写入一个数组 public void write(final byte[] b) 
    4. 按照偏移量写入 public void write(final byte b[], final int off, final int len) 
    5. 写入换行和回车,即一行结束,要与上面的命令结合起来就无敌了。public void writeCrLf() 
     
     
    针对Redis的协议有一个通用的工具类 
    redis.clients.jedis.Protocol,包括发送命令的方法,和接受命令的方法。 


    最基础的客户端 redis.clients.jedis.Connection 
    一个Connection已经就是一个最最基础的客户端,包括三个基本元素,一个Socket, 和一个RedisOutputStream和一个RedisInputStream。 
    其中Socket主要与服务端建立真正的网络链接,获得InputStream和OutputStream 
    RedisOutputStream和RedisInputStream主要对InputStream和OutputStream进行包装,提供基本的读写操作。 

    另外增加各种协议层次的发送命令和收取结果的方法,都是通过Protocol类的操作RedisOutputStream和RedisInputStream完成的。

最基本的客户端Connection 要发送什么命令给服务器,还需要自己根据枚举类型自己传递,自然想到可以把自定义封装成方法,并且增加了对byte数组形式的支持,从而出现了以下命令。

Connection ----  BinaryClient   ---- Client
最基本的客户端   二进制版            普通字符串版

基本可用的客户端有了,又在这个基础上形成了最常用的类BinaryJedis 和 Jedis。

但是一个客户端是单线程,当Jedis被很多实例调用时自然就不够用,此时就需要考虑使用池子。

Jedis这里使用Apache 的Pool。实现起来也是很简单。其内部就是 GenericObjectPool 对象,将jedis保存在其中。

另外就是需要有个Factory来生成Jedis对象。这个Factory是JedisPoll类的一个内部类JedisFactory继承自BasePoolableObjectFactory。重写了makeObject(),destroyObject(final Object obj),validateObject(final Object obj)三个方法。

原文地址:https://www.cnblogs.com/lsx1993/p/4632986.html