jedis源码分析——JedisPool
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等方法调用。
相关推荐
txj 2020-08-17
亦碎流年 2020-06-18
middleware0 2020-06-13
anglehearts 2020-04-03
camhan 2020-05-09
枫叶上的雨露 2020-05-04
zhangtianshun 2020-05-03
博了个客 2020-04-29
sunzxh 2020-04-22
八角塘塘主 2020-04-09
GavinZhera 2020-04-08
郭宇 2020-02-22
Cheetahcubs 2020-02-12
middleware0 2020-02-11
wangxiaoxue 2020-01-23
guweiyuthinker 2020-01-20
MLXY 2020-01-21