配置Jedis超时

dra*_*nxo 10 java redis jedis

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

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

Map<String, String> alreadyStored = jedis.hgetAll(redisTargetHash);
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

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)
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题:

Jedis jedis = new Jedis(REDIS_MASTER_NODE, 6379, 1800);
Run Code Online (Sandbox Code Playgroud)

小智 17

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

public Jedis(final String host, final int port, final int timeout)
Run Code Online (Sandbox Code Playgroud)

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

  • 什么是超时单位?就像在,它是在几秒或几毫秒? (9认同)
  • 是此连接超时或套接字读取超时. (4认同)
  • 构造函数的timeout参数以毫秒为单位,因为此值在内部受到java.net.Socket #connect(java.net.SocketAddress,int)和java.net.Socket #setSoTimeout(int)方法的影响.所以这个值是连接和套接字读取超时. (3认同)

小智 9

这是xetorthio的答案的一些扩展,但这里有类似的方法用于JedisPool.(警告:这是基于我直接查看Jedis版本2.6.2代码的理解,并且尚未在实际用例中进行测试.)

    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    jedisPoolConfig.setMaxWaitMillis(writeTimeout);
    JedisPool pool = new JedisPool(jedisPoolConfig, redisHost, port, readTimeout);
Run Code Online (Sandbox Code Playgroud)

writeTimeout是池中Jedis资源等待写操作的最长时间.

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

  • JedisPoolConfig 从 BaseGenericObjectPool 继承 maxWaitMillis ,它只是从 JedisPoolConfig 获取/借用对象的超时 https://commons.apache.org/proper/commons-pool/apidocs/org/apache/commons/pool2/impl/BaseGenericObjectPool.html# getMaxWaitMillis--我认为它与远程redis的writetimeout没有任何关系 (3认同)