【可改进的问题】
问题是jedispool有没有办法监控状态,比如说当前连接有多少,当前idle连接有多少,之类的同求。真心不想每次都构建连接然后在手动将连接返回池。
 
 

【JedisPool源码】

  1. package redis.clients.jedis;
  2. import org.apache.commons.pool.impl.GenericObjectPool.Config;
  3. import redis.clients.util.Pool;
  4. public class JedisPool extends Pool<Jedis>
  5. {
  6. public JedisPool(GenericObjectPool.Config poolConfig, String host)
  7. {
  8. this(poolConfig, host, 6379, 2000, null);
  9. }
  10. <strong>  public JedisPool(String host, int port)
  11. {
  12. super(new GenericObjectPool.Config(), new JedisFactory(host, port, 2000, null));
  13. }</strong>
  14. <strong>  public JedisPool(GenericObjectPool.Config poolConfig, String host, int port, int timeout, String password)
  15. {
  16. super(poolConfig, new JedisFactory(host, port, timeout, password));
  17. }</strong>
  18. public JedisPool(GenericObjectPool.Config poolConfig, String host, int port)
  19. {
  20. this(poolConfig, host, port, 2000, null);
  21. }
  22. public JedisPool(GenericObjectPool.Config poolConfig, String host, int port, int timeout)
  23. {
  24. this(poolConfig, host, port, timeout, null);
  25. }
  26. }

JedisPool继承了Pool,Pool的源码如下:

  1. package redis.clients.util;
  2. import org.apache.commons.pool.PoolableObjectFactory;
  3. import org.apache.commons.pool.impl.GenericObjectPool;
  4. import org.apache.commons.pool.impl.GenericObjectPool.Config;
  5. import redis.clients.jedis.exceptions.JedisConnectionException;
  6. import redis.clients.jedis.exceptions.JedisException;
  7. public abstract class Pool<T>
  8. {
  9. private final GenericObjectPool internalPool;
  10. public Pool(GenericObjectPool.Config poolConfig, PoolableObjectFactory factory)
  11. {
  12. this.internalPool = new GenericObjectPool(factory, poolConfig);
  13. }
  14. public T getResource()
  15. {
  16. try {
  17. return this.internalPool.borrowObject();
  18. } catch (Exception e) {
  19. throw new JedisConnectionException("Could not get a resource from the pool", e);
  20. }
  21. }
  22. public void returnResource(T resource)
  23. {
  24. try {
  25. this.internalPool.returnObject(resource);
  26. } catch (Exception e) {
  27. throw new JedisException("Could not return the resource to the pool", e);
  28. }
  29. }
  30. public void returnBrokenResource(T resource)
  31. {
  32. try {
  33. this.internalPool.invalidateObject(resource);
  34. } catch (Exception e) {
  35. throw new JedisException("Could not return the resource to the pool", e);
  36. }
  37. }
  38. public void destroy()
  39. {
  40. try {
  41. this.internalPool.close();
  42. } catch (Exception e) {
  43. throw new JedisException("Could not destroy the pool", e);
  44. }
  45. }
  46. }

至此我们已经清楚了,JedisPool使用了apache的GenericObjectPool来作为redis连接管理pool。GenericObjectPool的官方地址是:http://commons.apache.org/pool/

JedisFactory是PoolableObjectFactory的子类,PoolableObjectFactory提供了可以被Pool管理的对象的若干生命周期方法,JedisFactory的源码如下:

  1. package redis.clients.jedis;
  2. import org.apache.commons.pool.BasePoolableObjectFactory;
  3. class JedisPool$JedisFactory extends BasePoolableObjectFactory
  4. {
  5. private final String host;
  6. private final int port;
  7. private final int timeout;
  8. private final String password;
  9. public JedisPool$JedisFactory(String host, int port, int timeout, String password)
  10. {
  11. this.host = host;
  12. this.port = port;
  13. this.timeout = ((timeout > 0) ? timeout : -1);
  14. this.password = password;
  15. }
  16. public Object makeObject()
  17. throws Exception
  18. {
  19. Jedis jedis;
  20. if (this.timeout > 0)
  21. jedis = new Jedis(this.host, this.port, this.timeout);
  22. else {
  23. jedis = new Jedis(this.host, this.port);
  24. }
  25. jedis.connect();
  26. if (null != this.password) {
  27. jedis.auth(this.password);
  28. }
  29. return jedis;
  30. }
  31. public void destroyObject(Object obj) throws Exception {
  32. if (obj instanceof Jedis) {
  33. Jedis jedis = (Jedis)obj;
  34. if (!(jedis.isConnected())) return;
  35. try {
  36. try {
  37. jedis.quit();
  38. } catch (Exception e) {
  39. }
  40. jedis.disconnect();
  41. }
  42. catch (Exception e)
  43. {
  44. }
  45. }
  46. }
  47. public boolean validateObject(Object obj) {
  48. if (obj instanceof Jedis) {
  49. Jedis jedis = (Jedis)obj;
  50. try {
  51. return ((jedis.isConnected()) && (jedis.ping().equals("PONG")));
  52. } catch (Exception e) {
  53. return false;
  54. }
  55. }
  56. return false;
  57. }
  58. }

上面代码非常清楚地说明了JedisFactory如何构建、销毁、验证Jedis对象。这些生命周期方法会被GenericObjectPool 的borrowObject,returnObject,invalidateObject等方法调用。

JedisPool连接池实现难点的更多相关文章

  1. Java与redis交互、Jedis连接池JedisPool

    Java与redis交互比较常用的是Jedis. 先导入jar包: commons-pool2-2.3.jar jedis-2.7.0.jar 基本使用: public class RedisTest ...

  2. 详解Jedis连接池报错处理

    在使用Jedis连接池模式下,比较常见的报错如下: redis.clients.jedis.exceptions.JedisConnectionException:Could not get a re ...

  3. redis单机连接池

    一.配置文件 1. db.properties配置文件#IP地址 redis.ip = 127.0.0.1 #端口号 redis.port= #最大连接数 redis.max.total= #最大空闲 ...

  4. 三:Redis连接池、JedisPool详解、Redisi分布式

    单机模式: package com.ljq.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; ...

  5. redis连接池(JedisPool)资源归还及timeout详解

    转载. https://blog.csdn.net/yaomingyang/article/details/79043019 一.连接池资源类详解都在注释上 package redis.v1.clie ...

  6. redis连接池——JedisPool和JedisCluster的介绍与使用

    目录 Jedis使用方式的介绍 Redis连接池介绍 创建连接池配置文件 单机版的Redis连接池 集群版的Redis连接池 总结 Jedis使用方式的介绍 Jedis就是Java实现的操作Redis ...

  7. Redis缓存连接池管理

    import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.Assert;import ...

  8. common-pool2对象池(连接池)的介绍及使用

    我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...

  9. Jedis编程设计:连接池

        Jedis作为redis的最佳客户端,它提供了连接池的特性,"连接池"在通常情况下可以有效的提高应用的通信能力,并且这是一种良好的设计模式.Jedis的连接池设计基于apa ...

随机推荐

  1. struts2自定义声明校验器

    1 //新建一个validators.xml在src根资源下,会覆盖default.xml的validators,所以你懂得 //接着,若使用声明式校验,则要把配置文件xxxAction-valida ...

  2. [转载] ubuntu开机直接进入命令行模式

    最近安装了ubuntu12.04来使用,每次都进入unity界面再进入命令行很不方便. 不需要界面的话,可以通过设置来开机进入命令行模式. 今天提供两中比较好的方法.经本人测试两中方法都可使用. [1 ...

  3. 《摇滚南京》——"人生下来就是孤独"

    昨天是纪录片<摇滚南京>东南大学站的展映分享会 我不是一个摇滚迷,作为学渣狗看论文.码代码的时候会塞个耳机,平时其实民谣听得更多一点,摇滚觉得有点高大上.所以整好趁着学校有活动,也跟着高大 ...

  4. HDU 3183 A Magic Lamp

    直接模拟   如果后一位比前一位小,那就一直 向前 pop()掉 维护他单调递增: #include<iostream> #include<cstring> #include& ...

  5. 隐藏 php apache 的版本号

    隐藏Apache版本信息 找到apache安装路径,譬如\Apache\conf\httpd.conf 修改httpd.conf ServerTokens ProductOnly ServerSign ...

  6. Hadoop学习总结之五:Hadoop的运行痕迹

    Hadoop学习总结之五:Hadoop的运行痕迹   Hadoop 学习总结之一:HDFS简介 Hadoop学习总结之二:HDFS读写过程解析 Hadoop学习总结之三:Map-Reduce入门 Ha ...

  7. Intent七大属性

    一.Intent的作用是什么?    1.Intent 用于封装程序的”调用意图“.两个Activity之间,可以把需要交换的数据封装成Bundle对象,然后使用Intent携带Bundle对象,实现 ...

  8. Android内存控制小技巧-使用矢量图来节省你的内存并简化你的开发。

    先上一个 位图和矢量图的 说明.http://zhidao.baidu.com/link?url=xwvs5CBzWeh15O3Ee4bICwCqg4PCQWwg5oZ0a6CVydbVZzufqrI ...

  9. 下载个jquery-easyui-1.3.0使用,把他导入到myeclipse10里,jquery-1.7.2.min.js报错。 错误如下, Syntax error on token "Invalid Regular Expression Options", no accurate correc

    1.选中报错的jquery文件“jquery-1.2.6.min.js”.2.右键选择 MyEclipse-->Exclude From Validation .3.再右键选择 MyEclips ...

  10. 让层遮挡select(ie6下的问题)

    虽然现在很多比较大的网站已经不考虑ie6了,不过这些方法,或者其中原理还是值得记录下来的.所以整理的时候,把这篇文章留下了. <script language="javascript& ...