Jedis 源代码阅读一 —— Jedis
这是jedis 源代码文件夹,我们接下来选择性阅读重要的接口以及实现。
└─redis
└─clients
├─jedis
│ │ BinaryClient.java
│ │ BinaryJedis.java
│ │ BinaryJedisCluster.java
│ │ BinaryJedisPubSub.java
│ │ BinaryShardedJedis.java
│ │ BitOP.java
│ │ BitPosParams.java
│ │ Builder.java
│ │ BuilderFactory.java
│ │ Client.java
│ │ Connection.java
│ │ DebugParams.java
│ │ GeoCoordinate.java
│ │ GeoRadiusResponse.java
│ │ GeoUnit.java
│ │ HostAndPort.java
│ │ Jedis.java
│ │ JedisCluster.java
│ │ JedisClusterCommand.java
│ │ JedisClusterConnectionHandler.java
│ │ JedisClusterInfoCache.java
│ │ JedisFactory.java
│ │ JedisMonitor.java
│ │ JedisPool.java
│ │ JedisPoolAbstract.java
│ │ JedisPoolConfig.java
│ │ JedisPubSub.java
│ │ JedisSentinelPool.java
│ │ JedisShardInfo.java
│ │ JedisSlotBasedConnectionHandler.java
│ │ MultiKeyPipelineBase.java
│ │ Pipeline.java
│ │ PipelineBase.java
│ │ Protocol.java
│ │ Queable.java
│ │ Response.java
│ │ ScanParams.java
│ │ ScanResult.java
│ │ ShardedJedis.java
│ │ ShardedJedisPipeline.java
│ │ ShardedJedisPool.java
│ │ SortingParams.java
│ │ Transaction.java
│ │ Tuple.java
│ │ ZParams.java
│ │
│ ├─commands
│ │ AdvancedBinaryJedisCommands.java
│ │ AdvancedJedisCommands.java
│ │ BasicCommands.java
│ │ BasicRedisPipeline.java
│ │ BinaryJedisClusterCommands.java
│ │ BinaryJedisCommands.java
│ │ BinaryRedisPipeline.java
│ │ BinaryScriptingCommands.java
│ │ BinaryScriptingCommandsPipeline.java
│ │ ClusterCommands.java
│ │ ClusterPipeline.java
│ │ Commands.java
│ │ JedisClusterBinaryScriptingCommands.java
│ │ JedisClusterCommands.java
│ │ JedisClusterScriptingCommands.java
│ │ JedisCommands.java
│ │ MultiKeyBinaryCommands.java
│ │ MultiKeyBinaryJedisClusterCommands.java
│ │ MultiKeyBinaryRedisPipeline.java
│ │ MultiKeyCommands.java
│ │ MultiKeyCommandsPipeline.java
│ │ MultiKeyJedisClusterCommands.java
│ │ ProtocolCommand.java
│ │ RedisPipeline.java
│ │ ScriptingCommands.java
│ │ ScriptingCommandsPipeline.java
│ │ SentinelCommands.java
│ │
│ ├─exceptions
│ │ InvalidURIException.java
│ │ JedisAskDataException.java
│ │ JedisClusterCrossSlotException.java
│ │ JedisClusterException.java
│ │ JedisClusterMaxRedirectionsException.java
│ │ JedisConnectionException.java
│ │ JedisDataException.java
│ │ JedisException.java
│ │ JedisMovedDataException.java
│ │ JedisRedirectionException.java
│ │
│ └─params
│ │ Params.java
│ │
│ ├─geo
│ │ GeoRadiusParam.java
│ │
│ ├─set
│ │ SetParams.java
│ │
│ └─sortedset
│ ZAddParams.java
│ ZIncrByParams.java
│
└─util
ClusterNodeInformation.java
ClusterNodeInformationParser.java
Hashing.java
IOUtils.java
JedisByteHashMap.java
JedisClusterCRC16.java
JedisURIHelper.java
KeyMergeUtil.java
MurmurHash.java
Pool.java
RedisInputStream.java
RedisOutputStream.java
SafeEncoder.java
Sharded.java
ShardInfo.java
Slowlog.java
Jedis.java
我们每次使用jedis都会初始化一个jedis对象,对下面代码肯定不会陌生:
public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommands,
AdvancedJedisCommands, ScriptingCommands, BasicCommands, ClusterCommands, SentinelCommands {
protected JedisPoolAbstract dataSource = null;
public Jedis() {
super();
}
public Jedis(final String host) {
super(host);
}
public Jedis(final String host, final int port) {
super(host, port);
}
............
Jedis对象调用父类BinaryJedis构造器:
public class BinaryJedis implements BasicCommands, BinaryJedisCommands, MultiKeyBinaryCommands,
AdvancedBinaryJedisCommands, BinaryScriptingCommands, Closeable {
protected Client client = null;
protected Transaction transaction = null;
protected Pipeline pipeline = null;
public BinaryJedis() {
client = new Client();
}
public BinaryJedis(final String host) {
URI uri = URI.create(host);
if (uri.getScheme() != null && uri.getScheme().equals("redis")) {
initializeClientFromURI(uri);
} else {
client = new Client(host);
}
}
public BinaryJedis(final String host, final int port) {
client = new Client(host, port);
}
public BinaryJedis(final String host, final int port, final int timeout) {
client = new Client(host, port);
client.setConnectionTimeout(timeout);
client.setSoTimeout(timeout);
}
实际上,new Jedis()的初始化中。最重要的是new Client()这句代码。
Client 继承自 BinaryClient
public class Client extends BinaryClient implements Commands {
public Client() {
super();
}
而BinaryClient又继承自Collection
public class BinaryClient extends Connection {
............
private String password;
private int db;
private boolean isInWatch;
............
public BinaryClient() {
super();
}
............
接着我们来看Collection代码:
public class Connection implements Closeable {
.....
protected Connection sendCommand(final ProtocolCommand cmd, final String... args) {
final byte[][] bargs = new byte[args.length][];
for (int i = 0; i < args.length; i++) {
// 对cmd判空并返回bytes
bargs[i] = SafeEncoder.encode(args[i]);
}
return sendCommand(cmd, bargs);
}
protected Connection sendCommand(final ProtocolCommand cmd) {
return sendCommand(cmd, EMPTY_ARGS);
}
protected Connection sendCommand(final ProtocolCommand cmd, final byte[]... args) {
try {
// 1.建立Socket连接
connect();
// 2.依照协议完毕IO操作,也就是命令的运行
Protocol.sendCommand(outputStream, cmd, args);
return this;
} catch (JedisConnectionException ex) {
/*
* When client send request which formed by invalid protocol, Redis
* send back error message before close connection. We try to read
* it to provide reason of failure.
*/
try {
String errorMessage = Protocol.readErrorLineIfPossible(inputStream);
if (errorMessage != null && errorMessage.length() > 0) {
ex = new JedisConnectionException(errorMessage, ex.getCause());
}
} catch (Exception e) {
/*
* Catch any IOException or JedisConnectionException occurred
* from InputStream#read and just ignore. This approach is safe
* because reading error message is optional and connection will
* eventually be closed.
*/
}
// Any other exceptions related to connection?
broken = true;
throw ex;
}
}
...
// 建立Sock连接
public void connect() {
if (!isConnected()) {
try {
socket = new Socket();
// ->@wjw_add
socket.setReuseAddress(true);
socket.setKeepAlive(true); // Will monitor the TCP connection is
// valid
socket.setTcpNoDelay(true); // Socket buffer Whetherclosed, to
// ensure timely delivery of data
socket.setSoLinger(true, 0); // Control calls close () method,
// the underlying socket is closed
// immediately
// <-@wjw_add
socket.connect(new InetSocketAddress(host, port), connectionTimeout);
socket.setSoTimeout(soTimeout);
outputStream = new RedisOutputStream(socket.getOutputStream());
inputStream = new RedisInputStream(socket.getInputStream());
} catch (IOException ex) {
broken = true;
throw new JedisConnectionException(ex);
}
}
}
...
在这里完毕了Socket连接。并返回这个Socket.
每次我们使用Jedis去运行命令。都是这个持有Soket的client去运行的。
比方:
/**
* Get the value of the specified key. If the key does not exist null is
* returned. If the value stored at key is not a string an error is returned
* because GET can only handle string values.
* <p>
* Time complexity: O(1)
*
* @param key
* @return Bulk reply
*/
@Override
public String get(final String key) {
checkIsInMultiOrPipeline();// 检查是否在事物中;检查是否是哟好难过管道技术
client.sendCommand(Protocol.Command.GET, key);// 使用Socket进行IO操作,运行命令
return client.getBulkReply();
}
jedis除了继承的BinaryJedis完毕主要的IO操作。还实现了 JedisCommands, MultiKeyCommands, AdvancedJedisCommands,ScriptingCommands, BasicCommands, ClusterCommands, SentinelCommands
这几个可使用的命令的接口。
你能够參考redis自带的 unitTest,更深入的理解。
http://download.csdn.net/detail/lemon89/9407039
关于soTimeout 与 connectionTimeOut
我不多说了,这个链接解释非常清楚。
http://stackoverflow.com/questions/7360520/connectiontimeout-versus-sockettimeout
Jedis 源代码阅读一 —— Jedis的更多相关文章
- Jedis源代码探索
[连接池实现] [一致性hash实现] [Redis客户端-Jedis源代码探索][http://blog.sina.com.cn/s/blog_6bc4401501018bgh.html] ...
- Mongodb源代码阅读笔记:Journal机制
Mongodb源代码阅读笔记:Journal机制 Mongodb源代码阅读笔记:Journal机制 涉及的文件 一些说明 PREPLOGBUFFER WRITETOJOURNAL WRITETODAT ...
- 【转】Tomcat总体结构(Tomcat源代码阅读系列之二)
本文是Tomcat源代码阅读系列的第二篇文章,我们在本系列的第一篇文章:在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码一文中介绍了如何在intelliJ IDEA 和 Ec ...
- 利用doxygen提高源代码阅读效率
阅读开源项目的源代码是提高自己编程能力的好方法,而有一个好的源代码阅读工具无疑能够让你在阅读源代码时事半功倍.之前找过不少源代码阅读工具,像SourceInsight.sourcenav.scitoo ...
- CI框架源代码阅读笔记5 基准測试 BenchMark.php
上一篇博客(CI框架源代码阅读笔记4 引导文件CodeIgniter.php)中.我们已经看到:CI中核心流程的核心功能都是由不同的组件来完毕的.这些组件类似于一个一个单独的模块,不同的模块完毕不同的 ...
- 淘宝数据库OceanBase SQL编译器部分 源代码阅读--Schema模式
淘宝数据库OceanBase SQL编译器部分 源代码阅读--Schema模式 什么是Database,什么是Schema,什么是Table,什么是列,什么是行,什么是User?我们能够能够把Data ...
- CI框架源代码阅读笔记3 全局函数Common.php
从本篇開始.将深入CI框架的内部.一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说.全局函数具有最高的载入优先权.因此大多数的框架中BootStrap ...
- [C++ 2011 STL (VS2012 Update4) 源代码阅读系列(2)]熟悉一些宏定义和模版偏特化或叫模版专门化
[C++ 2011 STL (VS2012 Update4) 源代码阅读系列(2)]熟悉一些宏定义和模版偏特化或叫模版专门化 // point_test.cpp : 知识点练习和测试,用于单步调试,跟 ...
- 【转】Tomcat源代码阅读系列
在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码(Tomcat源代码阅读系列之一) Tomcat总体结构(Tomcat源代码阅读系列之二) Tomcat启动过程(Tomcat ...
随机推荐
- HDU 4010 Query on The Trees (动态树)(Link-Cut-Tree)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4010 题意; 先给你一棵树,有 \(4\) 种操作: 1.如果 \(x\) 和 \(y\) 不在同一 ...
- 用硬件卡克隆Linux集群
650) this.width=650;" onclick="window.open("http://blog.51cto.com/viewpic.php?refimg= ...
- 前端项目中常用es6知识总结 -- Promise逃脱回调地狱
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...
- CTF加密题型解析:RSA算法的CTF解法之一
RSA介绍 根据加密原理,可以将大部分的加密算法分为两大类:对称加密算法和非对称加密算法.对称加密算法的加密和解密采用的是同一套算法规则.而非对称加密算法加密时用的是公钥(公开给所有人),解密时用的是 ...
- 安装Mysql最新版本mysql-5.7.10-winx64出现的几个问题解决
电脑是64位的安装不了Windows (x86, 32-bit),Mysql installer MSI ,然后下载了Windows (x86, 32-bit), ZIP Archive 这种是免安装 ...
- Arch Linux实体机安装记录
下面将记录笔者在戴尔笔记本安装arch linux的过程,用于记录,以便下次使用. 本文的内容参考arch linux官方Wiki. 首先,使用Power ISO把镜像安装到U盘,使用U盘安装. 通过 ...
- 杭电1102 Constructing Roads
Constructing Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- POJ--1753--Flip Game【DFS】
链接:http://poj.org/problem? id=1753 题意:一个4*4的方格,有白棋或者黑棋.每次操作是一个位置的颜色翻转,即白变黑.黑变白,而且与它相邻的四个位置的颜色也都跟着改变, ...
- 3.lombok系列3:lombok的实验类特性
转自:https://blog.csdn.net/54powerman/article/details/72516755 lombok除了已经推荐使用的基本功能,还维护了一个创新型的注解,有些功能有违 ...
- 绝对定位等html结构,水平居中的处理方案
1.父子结构,父relative,子absolute.子元素要水平居中:left:50%:margin-left:子元素一半的宽度.因为定位的left是按左边框开始计算.[固定问题的模块化解决]