11

我们应该在什么时候使用这种方法。在 JedisConnectionException、JedisDataException 或任何 JedisException 上。据我所知,Jedis 没有好的 API 文档。

try {
    Jedis jedis = JedisFactory.getInstance();
    Pipeline pipe = jedis.pipelined();
    Response<Set<Tuple>> idWithScore = pipe.zrangeWithScores(cachekey, from, to);
    **// some statement which may cause some other exception**
    Response<String> val = pipe.get(somekey);
    pipe.exec();
    pipe.sync();
}catch (JedisConnectionException e) {
    JedisFactory.returnBrokenResource(jedis);
}catch(Exception e){
    **// What API I should use here?, how to find whether to use returnBrokenResource(jedis) or returnResource(jedis)**
}finally{
    JedisFactory.returnResource(jedis);
}
4

3 回答 3

11

对于后来者!

不推荐使用returnBrokenResource()、returnResource()。只需在 finally 安全块中使用jedis.close() 即可。

finally {
  if (jedis != null) {
    jedis.close();
  }
}

如果 Jedis 是从池中借用的,它将以适当的方法返回到池中,因为它已经确定发生了 JedisConnectionException。如果 Jedis 不是从池中借来的,它将断开连接并关闭。

于 2016-01-26T10:26:05.263 回答
10

当对象的状态不可恢复时,您应该使用 returnBrokenResource。Jedis 对象表示与 Redis 的连接。当物理连接中断或客户端和服务器之间的同步丢失时,它变得不可用。

对于 Jedis,这些错误由 JedisConnectionException 表示。所以我会使用 returnBrokenResource 这个异常,而不是其他异常。

JedisDataException 更多与 Jedis API 的错误使用或服务器端 Redis 错误有关。

JedisException 适用于其他一切(通常在较低级别的错误之后引发,独立于 Jedis)。

于 2013-06-13T16:09:39.763 回答
1

根据 jedis 文档的示例代码

public String get(String keyName)
{
    Jedis redis = null;
    try
    {
        redis = redisPool.getResource();
        return redis.get(keyName);
    }
    catch (JedisConnectionException e) 
    {
        if (redis != null) 
        {
            redisPool.returnBrokenResource(redis);
            redis = null;
        }
        throw e;
    }
    finally
    {
        if (redis != null)
        {
            redisPool.returnResource(redis);
        }
    }
}
于 2014-11-24T17:05:09.777 回答