我在完成.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);
答案 0 :(得分:15)
如果您想要做的是设置Jedis连接timeout
,您应该使用为此制作的特殊构造函数来执行此操作:
public Jedis(final String host, final int port, final int timeout)
您正在做的是从jedis
设置redis设置的超时。执行CONFIG SET timeout 60
意味着redis将在60
秒后关闭空闲客户端连接。这就是你在Jedis中获得例外的原因。
答案 1 :(得分:9)
这是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
。
答案 2 :(得分:2)
很少有事情需要考虑:
对于Jedis和JedisPool类,超时都是以毫秒为单位。
默认超时,至少在2.5.1中,如我所见,是2000(milisec):int redis.clients.jedis.Protocol.DEFAULT_TIMEOUT = 2000 [0x7d0]
根据this文档,即使客户端处于空闲状态,Redis 2.6或更高版本也不会关闭连接。我还没有验证过这个问题,我会尽力更新帖子。