配置Jedis超时

我在完成.hgetall时遇到了问题,这是我尝试过的:

Jedis jedis = new Jedis(REDIS_MASTER_NODE); jedis.connect(); jedis.configSet("timeout", "30"); Map 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); 

做到了。

如果你想要做的是设置Jedis连接超时,你应该使用为此做的特殊构造函数:

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

你正在做的是从jedis设置redis设置的超时。 执行CONFIG SET timeout 60意味着redis将在60秒后关闭空闲客户端连接。 这就是你在Jedis中获得例外的原因。

这是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

几件事情要考虑:

  1. 对于Jedis和JedisPool类,超时以毫秒为单位。 默认超时,至少在2.5.1中,如我所见,是2000(milisec): int redis.clients.jedis.Protocol.DEFAULT_TIMEOUT = 2000 [0x7d0]

  2. 根据此文档,即使客户端处于空闲状态,最新版本的Redis也不会关闭连接。 我还没有validation这一点,我会尽力更新post。