15

我在完成 时遇到问题.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);
4

3 回答 3

22

如果您要做的是设置 Jedis 连接timeout,您应该使用为此制作的特殊构造函数进行设置:

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

您正在做的是设置Redis 设置的超时时间Jedis。这样做CONFIG SET timeout 60,意味着 Redis 将在几秒钟后关闭空闲的客户端连接。60这就是为什么你在 Jedis 中得到例外。

于 2013-02-21T11:12:43.103 回答
10

这是对 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有关详细信息,请参阅。

于 2015-02-12T00:10:28.190 回答
4

有几点需要考虑:

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

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

于 2016-07-14T19:34:23.253 回答