做为Redis官方推荐的三个Java Client之一,Jedis推出时间最先,使用最为普遍(Spring默认使用的Redis Client就是Jedis),同时Star数也遥遥领先于另外两个。和其余Redis Client同样,Jedis经过RESP协议向Redis发送命令请求和解析响应数据。java
最新版本的Jedis代码行数超过18K,和Redis自己(20K)处于同一规模。面对如此庞大的项目,分模块阅读是必然之选。因为类的数量太多,本文只在类层面进行简单解读,不会涉及具体的源代码。值得一提的是,虽然Jedis的代码称不上规范,好比全局缺注释、某些类的长度过长,但因为绝大多数方法都很简短,加上清晰的命名和完善的单元测试,代码可读性并无太大影响。git
Jedis/BinaryJedis: 入口类,封装Redis的各类命令。github
Client/BinaryClient/Connection: 与Redis进行具体的交互工做。redis
Protocol, RedisInputStream, RedisOutputStream: 实现RESP协议。算法
ShardedJedis/BinaryShardedJedis: 首先对传入的Key进行Hash计算(默认使用高性能、低碰撞率的MurmurHash算法),而后根据计算结果找到相应的Jedis实例,最后执行命令。apache
JedisPool: 基于Apache Commons Pool实现的链接池,经过JedisFactory获取Jedis实例。缓存
JedisSentinelPool: 经过侦听"switch-master"事件,每当master切换时,调用JedisFactory从新初始化master链接信息。安全
ShardedJedisPool: 与JedisPool相似,经过ShardedJedisFactory获取ShardedJedis实例。工具
Pipeline: 经过Jedis#pipelined()获取实例。以类型安全的方式获取执行结果,经过BuilderFactory将Object类型的Response转化为指望的结果类型。性能
非事务模式:构建Response Queue,而后经过Client#getMany()批量获取结果。
事务模式:经过MultiResponseBuilder缓存Response,而后批量获取结果。
Transaction: 经过Jedis#multi()获取实例。自然的事务属性,经过Client#getMany()批量获取结果,但没法获取单条命令的结果,且类型非安全。
ShardedJedisPipeline: ShardedJedis#pipelined()获取实例。不一样于Pipeline和Transaction,因为请求可能落到多个Client上,只能经过Client#getOne()挨个获取结果,类型非安全。
JedisCluster/BinaryJedisCluster: 经过JedisClusterConnectionHandler获取Jedis实例,而后执行命令。
JedisClusterConnectionHandler & JedisClusterInfoCache: 经过Collections#shuffle()随机返回一个Jedis实例。使用ReentrantReadWriteLock保证更新Cluster的Jedis实例列表时的线程安全性。
JedisClusterCommand: 经过retry机制获取有效的Jedis实例,而后再执行命令。
A: Binary的父类与非Binary的子类表面的区别是不论是key,仍是value,只要涉及字符串语义的参数,前者都用byte[]类型传参,然后者使用String类型。而深层次的缘由,我认为跟RESP协议有关,RESP协议是面向字节的协议,对于性能要求极高的场景,使用Binary类有助于提升性能(由于减小了一次String到byte[]的转换)。
A: 简单来讲,Pipeline和Transaction是批处理运行模式,一次获取多条命令的执行结果,而Jedis只能一条一条获取。而Pipeline和Transaction的区别主要有两点:1)Pipeline同时支持事务模式和非事务模式,而Transaction支持事务模式。2)Pipeline类型安全,Transaction类型非安全。
上面提到Jedis的代码规模很大,进一步分析排名靠前的几个大类,能够发现两个明显的特色:
方法不少,最多的一个类有250+方法,直接结果就是致使类的长度也很长(3000+)
大多数方法实现不超过5行,而且听从同一结构
单从缩减代码行数的角度来看,至少能够考虑两种方式:
使用代码生成工具自动生成享有同一结构的方法
使用Java 8引入的Functional Interface简化代码