配置 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 连接超时故障排查点 | 绑定配置 | 保护模式 | 防火墙 )