配置 Jedis 超时

Posted

技术标签:

【中文标题】配置 Jedis 超时【英文标题】:Configure Jedis timeout 【发布时间】:2013-02-06 06:26:32 【问题描述】:

我在填写.hgetall() 时遇到问题,这是我尝试过的:

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);

【问题讨论】:

【参考方案1】:

如果你想做的是设置 Jedis 连接timeout,你应该使用专门的构造函数来做:

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

您正在做的是在Jedis 的 Redis 设置上设置 超时。执行CONFIG SET timeout 60,意味着Redis 将在60 秒后关闭idle 客户端连接。这就是为什么您在 Jedis 中会遇到异常。

【讨论】:

超时单位是什么?比如,是秒还是毫秒? @xetorthio 你能告诉我如何在绝地中指定查询超时吗?目前我正在使用jedis-2.6.0.jar 请告诉我它们的默认值是什么。据我了解connectionTimeout 是新连接建立超时。 构造函数的超时参数以毫秒为单位,因为这个值在内部影响到 java.net.Socket#connect(java.net.SocketAddress, int) 和 java.net.Socket#setSoTimeout(int) ) 方法。所以这个值是连接和套接字读取超时。【参考方案2】:

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

【讨论】:

JedisPoolConfig 从 BaseGenericObjectPool 继承 maxWaitMillis ,它只是从 JedisPoolConfig commons.apache.org/proper/commons-pool/apidocs/org/apache/… 获取/借用对象的超时,我认为它与远程 redis 的 writetimeout 无关 maxWaitMillis -:连接池资源耗尽时调用方的最大等待时间(以毫秒为单位)。【参考方案3】:

需要考虑的几件事:

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

    根据this 文档,Redis 2.6 或更高版本不会关闭连接,即使客户端处于空闲状态也是如此。我还没有验证这一点,我会在验证时尝试更新帖子。

【讨论】:

您是否有机会查看在空闲期超时后连接是否关闭?另外,我猜你是说 Jedis(不是 Redis)没有关闭。 Redis 2.6 及更高版本将默认保持客户端连接打开。

以上是关于配置 Jedis 超时的主要内容,如果未能解决你的问题,请参考以下文章

错误记录使用 Jedis 操作 Redis 数据库报错 ( JedisConnectionException | Redis 连接超时故障排查点 | 绑定配置 | 保护模式 | 防火墙 )

jedis 连接超时后还需要关闭吗

解决redis连接超时

jedis超时重试机制注意事项

redis连接超时问题

解决redis上显示timeout连接超时