文档章节

Jedis 1.0.0 版 源码分析系列2:Connection.java

强子大叔的码田
 强子大叔的码田
发布于 2014/03/12 23:49
字数 497
阅读 228
收藏 0
package redis.clients.jedis;

import redis.clients.util.RedisInputStream;
import redis.clients.util.RedisOutputStream;

import java.io.*;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

public class Connection {
    private String host;//ip
    private int port = Protocol.DEFAULT_PORT;//端口
    private Socket socket;//socket句柄
    private Protocol protocol = new Protocol();//具体操作对象
    private RedisOutputStream outputStream;//socket的输出流
    private RedisInputStream inputStream;//socket的输入流
    private int pipelinedCommands = 0;//管道命令计数器
    private int timeout = 2000;//socket超时时间

    public int getTimeout() {//获取socket超时时间
	return timeout;
    }

    public void setTimeout(int timeout) {//设置socket超时时间
	this.timeout = timeout;
    }

    public void setTimeoutInfinite() {//设置无穷大超时时间
	try {
	    socket.setSoTimeout(0);
	} catch (SocketException ex) {
	    throw new JedisException(ex);
	}
    }

    public void rollbackTimeout() {//回滚超时时间设置
	try {
	    socket.setSoTimeout(timeout);
	} catch (SocketException ex) {
	    throw new JedisException(ex);
	}
    }

    public Connection(String host) {//够早一个connection
	super();
	this.host = host;
    }

    protected Connection sendCommand(String name, String... args) {
		try {
			connect();//连接server
		} catch (UnknownHostException e) {
			throw new JedisException("Could not connect to redis-server", e);
		} catch (IOException e) {
			throw new JedisException("Could not connect to redis-server", e);
		}
	protocol.sendCommand(outputStream, name, args);//发送命令
	pipelinedCommands++;//增加计数器
	return this;
    }

    public Connection(String host, int port) {//构造connection
	super();
	this.host = host;
	this.port = port;
    }

    public String getHost() {//获取IP
	return host;
    }

    public void setHost(String host) {//设置IP
	this.host = host;
    }

    public int getPort() {//获取端口
	return port;
    }

    public void setPort(int port) {//设置端口
	this.port = port;
    }

    public Connection() {//构造connection
    }

    public void connect() throws UnknownHostException, IOException {
	if (!isConnected()) {//如果没有连接,才会连接对方并且给本地变量赋值
	    socket = new Socket(host, port);
	    socket.setSoTimeout(timeout);
	    outputStream = new RedisOutputStream(socket.getOutputStream());
	    inputStream = new RedisInputStream(socket.getInputStream());
	}
    }

    public void disconnect() {//断开连接
	if (isConnected()) {
	    try {
		inputStream.close();
		outputStream.close();//关闭流
		if (!socket.isClosed()) {
		    socket.close();
		}//关闭socket.
	    } catch (IOException ex) {
		throw new JedisException(ex);
	    }
	}
    }

    public boolean isConnected() {//判断是否连接上了
	return socket != null && socket.isBound() && !socket.isClosed()
		&& socket.isConnected() && !socket.isInputShutdown()
		&& !socket.isOutputShutdown();
    }

    protected String getStatusCodeReply() {//获取响应
	pipelinedCommands--;
	return (String) protocol.read(inputStream);
    }

    public String getBulkReply() {//获取响应
	pipelinedCommands--;
	return (String) protocol.read(inputStream);
    }

    public int getIntegerReply() {//获取响应
	pipelinedCommands--;
	return ((Integer) protocol.read(inputStream)).intValue();
    }

    @SuppressWarnings("unchecked")
    public List<String> getMultiBulkReply() {//获取响应
	pipelinedCommands--;
	return (List<String>) protocol.read(inputStream);
    }

    @SuppressWarnings("unchecked")
    public List<Object> getObjectMultiBulkReply() {//获取响应
	pipelinedCommands--;
	return (List<Object>) protocol.read(inputStream);
    }

    public List<Object> getAll() {//批量获取响应
	List<Object> all = new ArrayList<Object>();
	while (pipelinedCommands > 0) {
	    all.add(protocol.read(inputStream));
	    pipelinedCommands--;
	}
	return all;
    }
}

这个函数很有意思。

public boolean isConnected() {//判断是否连接上了
	return socket != null && socket.isBound() && !socket.isClosed()
		&& socket.isConnected() && !socket.isInputShutdown()
		&& !socket.isOutputShutdown();
    }

 

© 著作权归作者所有

强子大叔的码田

强子大叔的码田

粉丝 907
博文 1429
码字总数 1219943
作品 9
南京
架构师
私信 提问
jedis 用连接池时超时返回值类型错误

这个是今天发现一个bug:在测试redis并发读写的时候(jedis作为客户端,并使用了连接池),总是报 java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Long a...

浮躁的码农
2016/04/05
1K
0
Redis操作异常: java.lang.ClassCastException: java.lang.Long cannot be cast to [B

背景描述: (1) 某项目,使用redis做存储,用redis的set性质来做实时统计,同时也存放其他统计数据; (2) 用到的key不少,value集合量较多; (3) 每天零点的时候,回清理当前redis中所有的数据;...

ouhoo
2018/03/14
5.2K
0
【Spring Cloud】Redis缓存接入监控、运维平台CacheCloud

CacheCloudCacheCloud提供一个Redis云管理平台:实现多种类型(Redis Standalone、Redis Sentinel、Redis Cluster)自动部署、解决Redis实例碎片化现象、提供完善统计、监控、运维功能、减少运...

冷冷gg
2018/01/02
1K
2
Redis开启远程登录连接

今天使用jedis客户端api连接远程连接redis的时候,一直报错,如下:  复制代码redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused:...

Airship
2016/10/27
25
0
JedisConnectionException: java.net.SocketException: Broken pipe

一个Redis异常,我本地环境测试无法重现,部署到服务器上就出现,不知大家是否又遇到过? 相关环境: 系统:Linux Redis版本:redis-3.0.7 客户端版本:jedis 2.9.0 异常信息: redis.client...

大轩
2017/11/23
1K
5

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot-MVC RequestBody中LocalDateTime的自适应配置

请求的json报文中可能会出现 一下几种: ['2019-01-01','2019-01-01 12:03:34','20190101120334'] 但是接收的Request实体类日期字段是LocalDateTime类型 LocalDateTime applyDate; 希望的情况......

汉堡OSC
25分钟前
5
0
小招喵所在的国家正处于怪兽入侵的战场中,这个国家一共有n+1个城市

import java.util.Arrays; import java.util.Scanner; public class test3 { public static long max=0;public static void main(String[] args) { Scanner sc = new Scanner(System.i......

南桥北木
26分钟前
4
0
活动策划思维导图模板分享,怎样绘制思维导图操作方法介绍

对于一场活动的举办可以事先使用思维导图简略的将整个过程进行总结归纳使用,这样清晰的思维导图即利于工作的进行,也可以清晰明了了熟悉整个过程,下面是为大家分享的几款活动策划思维导图模...

干货趣分享
33分钟前
5
0
Android高级xml布局之输入框EditText设计

今天给大家介绍一下如何实现一款简约时尚的安卓登陆界面。大家先看一下效果图 当用户输入时动态出现删除按钮 现在先罗列一下技术点: 1.如何使用圆角输入框和按钮背景 2.如何实现“手机号”、...

shzwork
57分钟前
4
0
RxJava进行单元测试的方式

@Test public void completeTask_retrievedTaskIsComplete() { // Given a new task in the persistent repository final Task newTask = new Task(TITLE, ""); ......

SuShine
59分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部