2013-02-21 47 views
9

我在完成一个.hgetall问题,这里就是我试过:配置Jedis超时

Jedis jedis = new Jedis(REDIS_MASTER_NODE); 
    jedis.connect(); 
    jedis.configSet("timeout", "30"); 

    Map<String, String> alreadyStored = jedis.hgetAll(redisTargetHash); 

和这里就是我得到:

Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out 
    at redis.clients.jedis.Protocol.process(Protocol.java:79) 
    at redis.clients.jedis.Protocol.read(Protocol.java:131) 
    at redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.java:199) 
    at redis.clients.jedis.Jedis.hgetAll(Jedis.java:851) 

好吧,

Jedis jedis = new Jedis(REDIS_MASTER_NODE, 6379, 1800); 

做到了。

回答

13

如果你想要做的是设置Jedis连接超时的,你使用该做出的特殊的构造应该这样做:

public Jedis(final String host, final int port, final int timeout) 

你在做什么是设置从jedis Redis的设置超时。做CONFIG SET timeout 60,意味着redis会在60秒后关闭空闲的客户端连接。这就是为什么你在杰迪斯得到例外。

+4

是此连接超时或套接字读取超时。 – Trying 2014-12-04 10:27:18

+5

什么是超时的单位?如在,是在几秒或几毫秒? – 2015-07-23 15:05:43

+0

@xetorthio你能告诉我如何在jedis中指定查询超时吗?目前我正在使用'jedis-2.6.0.jar'请告诉我它们的默认值是什么。 根据我的理解'connectionTimeout'是新的连接建立超时。 – 2015-08-04 12:03:41

5

这是对xetorthio的答案的一个扩展,但这里使用JedisPool类似的方法。 (警告:这是从在Jedis版本2.6.2代码直接找根据我的理解,并没有在现场使用情况进行了测试。)

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); 
    jedisPoolConfig.setMaxWaitMillis(writeTimeout); 
    JedisPool pool = new JedisPool(jedisPoolConfig, redisHost, port, readTimeout); 

的writeTimeout是从一个Jedis资源最大时间池等待写入操作。

为池构造函数指定的readTimeout是套接字读取的等待时间,有关更多特定细节,请参阅java.net.Socket.setSoTimeout

+0

为我工作。非常感谢.. – 2017-06-14 04:54:44

1

几件事情要考虑:

  1. 对于这两种Jedis和JedisPool类,超时为以毫秒为单位。 默认的超时,至少在2.5.1,我看到的是2000(以毫秒为单位):int redis.clients.jedis.Protocol.DEFAULT_TIMEOUT = 2000 [0x7d0]

  2. this文档,最近Redis的版本不密切的联系,即使客户端是空闲的。我还没有验证过这一点,当我这样做时我会尝试更新该帖子。