【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)三个方法。

jedis的源码理解-基础篇的更多相关文章

  1. 鸿蒙内核源码分析(VFS篇) | 文件系统和谐共处的基础 | 百篇博客分析OpenHarmony源码 | v68.01

    子曰:"质胜文则野,文胜质则史.文质彬彬,然后君子." <论语>:雍也篇 百篇博客系列篇.本篇为: v68.xx 鸿蒙内核源码分析(VFS篇) | 文件系统和谐共处的基 ...

  2. jQuery2.x源码解析(设计篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...

  3. JUC源码分析-集合篇(一)ConcurrentHashMap

    JUC源码分析-集合篇(一)ConcurrentHashMap 1. 概述 <HashMap 源码详细分析(JDK1.8)>:https://segmentfault.com/a/1190 ...

  4. 鸿蒙内核源码分析(文件句柄篇) | 深挖应用操作文件的细节 | 百篇博客分析OpenHarmony源码 | v69.01

    百篇博客系列篇.本篇为: v69.xx 鸿蒙内核源码分析(文件句柄篇) | 深挖应用操作文件的细节 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说 ...

  5. 鸿蒙内核源码分析(文件系统篇) | 用图书管理说文件系统 | 百篇博客分析OpenHarmony源码 | v63.01

    百篇博客系列篇.本篇为: v63.xx 鸿蒙内核源码分析(文件系统篇) | 用图书管理说文件系统 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...

  6. 鸿蒙内核源码分析(fork篇) | 一次调用,两次返回 | 百篇博客分析OpenHarmony源码 | v45.03

    百篇博客系列篇.本篇为: v45.xx 鸿蒙内核源码分析(Fork篇) | 一次调用,两次返回 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内 ...

  7. 鸿蒙内核源码分析(寄存器篇) | 小强乃宇宙最忙存储器 | 百篇博客分析OpenHarmony源码 | v38.02

    百篇博客系列篇.本篇为: v38.xx 鸿蒙内核源码分析(寄存器篇) | 小强乃宇宙最忙存储器 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...

  8. 鸿蒙内核源码分析(CPU篇) | 整个内核就是一个死循环 | 祝新的一年牛气冲天 ! | v32.02

    百篇博客系列篇.本篇为: v32.xx 鸿蒙内核源码分析(CPU篇) | 整个内核就是一个死循环 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...

  9. 鸿蒙内核源码分析(定时器篇) | 哪个任务的优先级最高 | 百篇博客分析OpenHarmony源码 | v31.02

    百篇博客系列篇.本篇为: v31.xx 鸿蒙内核源码分析(定时器篇) | 哪个任务的优先级最高 | 51.c.h .o 本篇说清楚定时器的实现 读本篇之前建议先读鸿蒙内核源码分析(总目录)其余篇. 运 ...

随机推荐

  1. POI解析Excel封装工具

    1. [代码][Java]代码     跳至 [1] [全屏预览] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2 ...

  2. LR回放https协议脚本失败:[GENERAL_MSG_CAT_SSL_ERROR]connect to host "XXX" failed:[10054] Connection reset by peer [MsgId:MERR-27780]

    最近做一个负载均衡项目的性能测试,使用LR录制脚本协议为https协议,回放脚本时出现报错: [GENERAL_MSG_CAT_SSL_ERROR]connect to host "XXX& ...

  3. 父标签浮动(float)“塌陷”问题

    浮动“塌陷” float参见: http://www.cnblogs.com/bigtreei/p/8110090.html http://www.w3school.com.cn/css/css_po ...

  4. Linux中变量测试与内容替换

  5. 《Python 机器学习》笔记(四)

    数据预处理--构建好的训练数据集 机器学习算法最终学习结果的优劣取决于两个主要因素:数据的质量和数据中蕴含的有用信息的数量. 缺失数据的处理 在实际应用过程中,样本由于各种原因缺少一个或多个值得情况并 ...

  6. jqprint 打印网页 jQuery print plugin

    ref://jQuery print plugin <!DOCTYPE html> <html lang="en"> <script src=&quo ...

  7. 【jenkins】jenkins实时显示python脚本输出

    jenkins在构建shell脚本时可以实时输出结果,但是在构建python脚本时,是等到python执行完成以后,才显示结果,这个对于我们判断脚本执行状态非常不利 这里介绍一种方法,能够实时显示py ...

  8. java动手动脑解析

    1. 类是java的最小单位,java的程序必须在类中才能运行 2. java函数加不加static有何不同 java中声明为static的方法称为静态方法或类方法.静态方法可以直接调用静态方法,访问 ...

  9. 一步步讲解如何开源自己的项目到GitHub上,Mac机示例

    如果你有自己的优秀项目,想要分享给大家,那GitHub会是你正确的选择.如何才能将自己的项目上传到GitHub上呢?接下来请一步一步跟着走. 需要准备的资源: 1.一台Mac机 2.安装git客户端( ...

  10. 【LeetCode】最大子阵列 Maximum Subarray(贪婪&分治)

    描述: Given an integer array nums, find the contiguous subarray (containing at least one number) which ...