zoukankan      html  css  js  c++  java
  • 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)三个方法。

  • 相关阅读:
    Python 从零学起(纯基础) 笔记 之 collection系列
    ARM学习 之 如何在向内核写入系统调用
    idea的git使用案例
    idea使用git的pull命令报错1
    String、StringBuilder以及StringBuffer
    HashMap实现原理及源码分析
    logback使用注意点1
    创建zookeeper集群
    disconf安装问题
    linux更换jdk版本
  • 原文地址:https://www.cnblogs.com/lsx1993/p/4632986.html
Copyright © 2011-2022 走看看