`

Jedis出现connection timeout问题解决方法(JedisPool连接池使用实例)

 
阅读更多

今天发现Jedis 默认的连接方式 jedis=new Jedis(“localhost”,6379),老是发生connection timeout. 后来发现jedis类包还有一种可以设置最大连接时间的方法。

1->获取Jedis实例需要从JedisPool中获取;
2->用完Jedis实例需要还给JedisPool;
3->如果Jedis在使用过程中出错,则也需要还给JedisPool;
代码如下

复制代码 代码如下:

JedisPoolConfig config = new JedisPoolConfig();

  config.setMaxActive(100);

  config.setMaxIdle(20);

  config.setMaxWait(1000l);
  JedisPool pool;
  pool = new JedisPool(config, "2xx.xx.xx.14", 6379);

  boolean borrowOrOprSuccess = true;
  try {
   jedis = pool.getResource();
   // do redis opt by instance
  } catch (JedisConnectionException e) {
   borrowOrOprSuccess = false;
   if (jedis != null)
    pool.returnBrokenResource(jedis);

  } finally {
   if (borrowOrOprSuccess)
    pool.returnResource(jedis);
  }
  jedis = pool.getResource();

JedisPool依赖apache类包

commons-pool-1.5.6.jar

1->虽然抛出JedisConnectionException,但实际上有两类错误,一类是pool.getReource(),得不到可用的jedis实例;另一类是jedis.set/get时出错也会抛出这个Exception;为了实现区分,所以根据instance是否为null来实现,如果为空就证明instance根本就没初始化,也就不用return给pool;如果instance不为null,则证明是需要返还给pool的;
2->在instance出错时,也要调用returnBrokenResource返还给pool,否则下次通过getResource得到的instance的缓冲区可能还存在数据,出现问题!

JedisPool的配置参数很大程度上依赖于实际应用需求、软硬件能力。以前没用过commons-pool,所以这次花了一整间专门看这些参数的含义。。。JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。

maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态就成exhausted了,在JedisPoolConfig

maxIdle:控制一个pool最多有多少个状态为idle的jedis实例;

whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种WHEN_EXHAUSTED_FAIL(表示无jedis实例时,直接抛出

NoSuchElementException)、WHEN_EXHAUSTED_BLOCK(则表示阻塞住,或者达到maxWait时抛出JedisConnectionException)、WHEN_EXHAUSTED_GROW(则表示新建一个jedis实例,也就说设置的maxActive无用);

maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;

testOnBorrow:在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;

testOnReturn:在return给pool时,是否提前进行validate操作;

testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;

timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数;

numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数;

minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;

softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义;

lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列;

其中JedisPoolConfig对一些参数的默认设置如下:
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1

分享到:
评论

相关推荐

    redis连接池jar jedis+common

    4. **使用JedisPool**:在需要使用Jedis时,从池中borrow一个实例,执行操作后返回给连接池,而不是直接关闭。 四、连接池的优势 1. **性能提升**:避免了频繁创建和销毁连接的开销,提高了应用的响应速度。 2. **...

    jedis-2.9.0.jar及连接池分享

    在这个案例中,commons-pool2-2.4.2.jar是Jedis连接池的依赖,它为Jedis提供了一个连接管理框架,确保高效地管理和重用Jedis实例。 4. Jedis连接池配置: 使用Jedis时,可以通过连接池来管理连接,例如使用`...

    java连接redis/jedis连接池/jedis相关工具/jedis对象存取

    在Java中,我们可以使用Apache Commons Pool2库来实现Jedis连接池。以下是一个简单的Jedis连接池配置示例: ```java import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public ...

    jedis连接池配置demo

    本教程将详细介绍如何配置Jedis的连接池——ShardedJedisPool,这对于初学者理解和实践Redis连接池的使用至关重要。 首先,我们需要引入Jedis和Apache Commons Pool2的依赖库。在Maven项目中,可以在pom.xml文件中...

    jedis pool配置

    在这个示例中,我们创建了一个JedisPool实例,设置了连接池配置,并在try-with-resources语句中获取和使用Jedis实例。完成操作后,确保连接池被正确关闭,释放所有资源。 对于数据缓存操作,Jedis提供了多种方法,...

    详谈Jedis连接池的使用

    在本文中,我们将详细讨论Jedis连接池的使用,包括构建连接池、获取连接资源、释放资源、典型的Jedis使用方法和优化。 一、构建连接池 构建连接池是使用Jedis连接池的第一步。下面是构建连接池的示例代码: ```...

    linux中安装redis和jedis及jedispool

    linux中安装redis和jedis及jedispool; redis安装所遇到的问题;

    jedisPool配置1

    在配置JedisPool时,了解其参数的意义至关重要,以确保正确地调整和优化连接池的行为。以下是对JedisPool配置参数的详细解释: 1. **maxActive**: 这个参数定义了连接池中允许的最大活动连接数。如果设置为-1,表示...

    jedis简单实例

    - **连接池管理**:为了提高性能和资源利用效率,推荐使用Jedis连接池(JedisPool)。 - **Pipeline和Batch操作**:通过批量发送命令,减少网络延迟,提高性能。 - **脚本支持**:Jedis支持Lua脚本,可以在服务器...

    jedis-2.9.0.jar和commons-pool2-2.6.0.jar下载(jedis连接redis数据库)

    3. **连接池配置**: 使用Apache Commons Pool配置JedisPool,这将管理连接的创建、复用和回收。 ```java JedisPoolConfig poolConfig = new JedisPoolConfig(); // 设置最大连接数、最大空闲连接等参数 Jedis...

    jedis 和 common-pool

    在与Jedis结合使用时,Apache Commons Pool用于创建和管理Jedis实例的池,这样可以有效地减少Redis连接的创建和销毁开销,提高系统性能。 在Jedis 2.7.0版本中,它使用了Apache Commons Pool 2.3来实现连接池功能。...

    Spring mvc整合redis实例(redis连接池)

    通过以上步骤,我们成功地在Spring MVC项目中整合了Redis,并使用连接池优化了性能。这种整合方式不仅提高了代码的可读性和可维护性,也充分利用了Redis的高效性能,为应用程序带来了更好的用户体验。在实际开发中,...

    jedis-2.9.0+commons-pool2-2.4.2redis依赖包

    4. 从连接池获取Jedis实例进行操作: ```java Jedis jedis = jedisPool.getResource(); try { jedis.set("key", "value"); String value = jedis.get("key"); } finally { jedis.close(); // 使用完后归还到...

    jedis2.9-common-pool

    4. **线程安全**:Jedis设计为线程不安全,推荐每个线程都使用独立的Jedis实例,或者配合连接池使用,以避免线程间的数据冲突。 5. **API友好**:Jedis的API设计简洁明了,易于理解和使用,大大降低了开发者的学习...

    Jedis API中文使用文档.-比较详细

    为了避免这些问题,可以使用 JedisPool,JedisPool 是一个线程安全的网络连接池。可以用 JedisPool 创建一些可靠 Jedis 实例,可以从池中拿到 Jedis 的实例。 Jedis 的基本操作 Jedis 提供了多种基本操作,包括...

    commons-pool.jar,jedis-2.4.2.jar

    接着,可以使用`getConnection()`方法获取Jedis实例,执行Redis命令: ```java Jedis jedis = RedisClient.getConnection(); jedis.set("key", "value"); String value = jedis.get("key"); RedisClient....

    jedis+commonspool2

    同时,`Jedis`还提供了连接池的监控和健康检查功能,以便在出现问题时及时发现和处理。 总的来说,`Jedis 2.8.1`与`Commons Pool 2`的结合使用,使得Java应用能够高效、稳定地与Redis服务器交互,尤其在高并发场景...

Global site tag (gtag.js) - Google Analytics