【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. coursera 《现代操作系统》 -- 第十周 文件系统(2)

    身份验证 Authentication 知道用户是谁.通过账号密码.Id 这样的识别出来. 访问控制 Permission 知道用户是谁后. 主动控制 记录用户ID和对应的访问权限 --> 记录 ...

  2. android 手机设置铃声

    和应用程序相比,普通用户在初初接触智能手机时最先反而会对多媒体功能产生兴趣,尤其是铃声.壁纸设定之类个性化功能,更是让不少追求时尚的年轻人乐此不疲.对于Android手机来说,其铃声.图片的个性化空间 ...

  3. ajax异步请求分页显示

    html代码: <!DOCTYPE html> <html lang="en"> <head>     <meta charset=&qu ...

  4. Wicket:一种构建和测试动态 Web 页面的简化框架

    https://www.ibm.com/developerworks/cn/web/wa-aj-wicket/

  5. c# 获取网页源代码(支持cookie),最简单代码

    /// /// 获取网页源码 public static string GetHtmls(string url, string referer = "", string cooki ...

  6. 常用mysql导入导出数据的命令

    To export 导出指定db_name的数据: $ mysqldump -u [uname] -p[pass] db_name > db_backup.sql 导出整个库的数据: $ mys ...

  7. JAVA虚拟机(JVM)以及跨平台原理(JDK、JRE、JVM)

    相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...

  8. commonAncestor

    commonAncestor 光标或选区所在区域最外层的祖先节点

  9. vscode使用vue中的v-for提示错误

    "vetur.validation.template": false 在设置里面把vetur.validation.template改为false 文件→首选项→设置 搜索vetu ...

  10. java中类名.class, class.forName(), getClass()区别

    Class对象的生成方式如下: 1.类名.class           说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象 2.Cla ...