jedis是Redis官网推荐的java客户端实现。下面分析一下JedisPool的实现
JedisPool源码如下:
package redis.clients.jedis;
import org.apache.commons.pool.impl.GenericObjectPool.Config;
import redis.clients.util.Pool;
public class JedisPool extends Pool<Jedis>
{
public JedisPool(GenericObjectPool.Config poolConfig, String host)
{
this(poolConfig, host, 6379, 2000, null);
}
public JedisPool(String host, int port)
{
super(new GenericObjectPool.Config(), new JedisFactory(host, port, 2000, null));
}
public JedisPool(GenericObjectPool.Config poolConfig, String host, int port, int timeout, String password)
{
super(poolConfig, new JedisFactory(host, port, timeout, password));
}
public JedisPool(GenericObjectPool.Config poolConfig, String host, int port)
{
this(poolConfig, host, port, 2000, null);
}
public JedisPool(GenericObjectPool.Config poolConfig, String host, int port, int timeout)
{
this(poolConfig, host, port, timeout, null);
}
}
JedisPool继承了Pool,Pool的源码如下:
package redis.clients.util;
import org.apache.commons.pool.PoolableObjectFactory;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool.Config;
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.jedis.exceptions.JedisException;
public abstract class Pool<T>
{
private final GenericObjectPool internalPool;
public Pool(GenericObjectPool.Config poolConfig, PoolableObjectFactory factory)
{
this.internalPool = new GenericObjectPool(factory, poolConfig);
}
public T getResource()
{
try {
return this.internalPool.borrowObject();
} catch (Exception e) {
throw new JedisConnectionException("Could not get a resource from the pool", e);
}
}
public void returnResource(T resource)
{
try {
this.internalPool.returnObject(resource);
} catch (Exception e) {
throw new JedisException("Could not return the resource to the pool", e);
}
}
public void returnBrokenResource(T resource)
{
try {
this.internalPool.invalidateObject(resource);
} catch (Exception e) {
throw new JedisException("Could not return the resource to the pool", e);
}
}
public void destroy()
{
try {
this.internalPool.close();
} catch (Exception e) {
throw new JedisException("Could not destroy the pool", e);
}
}
}
至此我们已经清楚了,JedisPool使用了apache的GenericObjectPool来作为redis连接管理pool。GenericObjectPool的官方地址是:http://commons.apache.org/pool/
JedisFactory是PoolableObjectFactory的子类,PoolableObjectFactory提供了可以被Pool管理的对象的若干生命周期方法,JedisFactory的源码如下:
package redis.clients.jedis;
import org.apache.commons.pool.BasePoolableObjectFactory;
class JedisPool$JedisFactory extends BasePoolableObjectFactory
{
private final String host;
private final int port;
private final int timeout;
private final String password;
public JedisPool$JedisFactory(String host, int port, int timeout, String password)
{
this.host = host;
this.port = port;
this.timeout = ((timeout > 0) ? timeout : -1);
this.password = password;
}
public Object makeObject()
throws Exception
{
Jedis jedis;
if (this.timeout > 0)
jedis = new Jedis(this.host, this.port, this.timeout);
else {
jedis = new Jedis(this.host, this.port);
}
jedis.connect();
if (null != this.password) {
jedis.auth(this.password);
}
return jedis;
}
public void destroyObject(Object obj) throws Exception {
if (obj instanceof Jedis) {
Jedis jedis = (Jedis)obj;
if (!(jedis.isConnected())) return;
try {
try {
jedis.quit();
} catch (Exception e) {
}
jedis.disconnect();
}
catch (Exception e)
{
}
}
}
public boolean validateObject(Object obj) {
if (obj instanceof Jedis) {
Jedis jedis = (Jedis)obj;
try {
return ((jedis.isConnected()) && (jedis.ping().equals("PONG")));
} catch (Exception e) {
return false;
}
}
return false;
}
}
上面代码非常清楚地说明了JedisFactory如何构建、销毁、验证Jedis对象。这些生命周期方法会被
GenericObjectPool 的borrowObject,returnObject,invalidateObject等方法调用。
分享到:
相关推荐
分析了redis的: 1)java客户端实现源码 2)分析了连接channel,包括命令时客户端和服务端的socket连接;...3)分析了JedisPool连接池配置 4) 分析了命令get set hmset 等逻辑 5)分析了subscribe实现源码
java开发redis的工具类。适合的redis结构为主从分区(16分区),并不适合redis_cluster
jedis源码,供开发者使用Java学习或者查询redis API使用,可以帮助开发者快速查找jedis源码实现。
jedis源码 (学习jedis必备,附带测试用例)
linux中安装redis和jedis及jedispool; redis安装所遇到的问题;
jedis 2.5.2 源码
jedisPool配置1
使用redis.clients.jedis.JedisPool配置jedis连接,进行数据缓存操作demo
就上一个资源 我发了两个jar包 表示歉意 这次补上源码文件 请童鞋们谅解
jedis-2.9.0 源码项目工程 导入 eclipse 可直接运行 * 基本测试: src\redis\clients\jedis\tests\JedisTest.java * 连接池测试: src\redis\clients\jedis\tests\JedisPoolTest.java * 常用命令测试: src\...
jedis-2.9.0+commons-pool2-2.4.2redis依赖包亲测可用
jedis源码包,jar包,希望下载的朋友可以用到。。。。
jedis 2.9.0源代码及jar包下载 https://github.com/xetorthio/jedis
JedisPool pool = new JedisPool("localhost", 6379); 以下是如何在try-with-resources块中运行单个SET命令: try (Jedis jedis = pool.getResource()) { jedis.set("clientName", "Jedis"); } Jedis实例实现...
Jedis2.1.0源码与Jar包,实现在Java中操作Redis服务器!
redis数据库需要的额基础jar包;jedis-2.6.2.jar;commons-pool-1.5.3.jar;commons-pool2-2.4.2.jar
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。这是jedis-3.0.0源码,支持集群和管道,希望大家喜欢。
commons-pool2-2.4.2.jar jedis-2.9.0.jar 另: * Jedis 的源码工程(导入 eclipse 可直接运行): http://download.csdn.net/download/tan3739/9994217 * Jedis 的源码下载(仅含源码,手动导入jar包):...
最新版本redis java 客户端,jedis-3.0.2 源码,支持Redis Streams。
jedis2.8.jar源码