Configure Jedis timeout
Solution 1
If what you want to do is set Jedis connection timeout
, you should do it using the special constructor made for that:
public Jedis(final String host, final int port, final int timeout)
What you are doing is setting the timeout on Redis settings from Jedis
. Doing CONFIG SET timeout 60
, means that Redis will close idle client connections after 60
seconds. That's why you get the exception in Jedis.
Solution 2
This is a bit of an extension to xetorthio's answer, but here is similar approach for use with a JedisPool. (Caveat: this is based on my understanding from looking at the Jedis version 2.6.2 code directly and has not been tested in a live use case.)
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxWaitMillis(writeTimeout);
JedisPool pool = new JedisPool(jedisPoolConfig, redisHost, port, readTimeout);
The writeTimeout is max time for a Jedis resource from the pool to wait for a write operation.
The readTimeout specified for the pool constructor is the wait time for a socket read, see java.net.Socket.setSoTimeout
for more specific details.
Solution 3
Few things to consider:
For both Jedis and JedisPool classes, timeout is in miliseconds. Default timeout, at least in 2.5.1, as I see, is 2000 (milisec):
int redis.clients.jedis.Protocol.DEFAULT_TIMEOUT = 2000 [0x7d0]
As per this documentation, Redis 2.6 or higher does not close connection, even if the client is idle. I have not verified this yet, and I will try to update the post when I do.
dranxo
Updated on July 31, 2022Comments
-
dranxo almost 2 years
I'm having problems completing an
.hgetall()
, here's what I've tried:Jedis jedis = new Jedis(REDIS_MASTER_NODE); jedis.connect(); jedis.configSet("timeout", "30"); Map<String, String> alreadyStored = jedis.hgetAll(redisTargetHash);
and here's what I get:
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)
This solved the issue:
Jedis jedis = new Jedis(REDIS_MASTER_NODE, 6379, 1800);
-
abi_pat almost 9 yearsWhats the unit of timeout? As in, is it in seconds or milliseconds?
-
Black_Rider almost 9 years@xetorthio can you tell me how I can specify query timeout in jedis ? Currently I am using
jedis-2.6.0.jar
Please also tell me what are default values of them. As per my understandingconnectionTimeout
is new connection establishing timeout. -
Stéphane B. over 8 yearsThe timeout parameter of the constructor is in milliseconds because this value is affected internally to java.net.Socket#connect(java.net.SocketAddress, int) and java.net.Socket#setSoTimeout(int) methods. So this this value is connection and a socket read timeout.
-
asgs about 6 yearsdid you get a chance to see if the connection is closed after the idle period timeout? Also, I guess you're saying Jedis (not Redis) doesn't close.
-
Manas Saxena over 5 yearsJedisPoolConfig inherits maxWaitMillis from BaseGenericObjectPool , its just a timeout for getting/borrowing the object from JedisPoolConfig commons.apache.org/proper/commons-pool/apidocs/org/apache/… I dont think it has anything to do with writetimeout of remote redis
-
Erica Kane over 5 yearsIt is Redis 2.6 and higher that will leave client connections open by default.
-
Kumar-Sandeep about 3 yearsmaxWaitMillis -: The maximum wait time (in milliseconds) of the caller when the connection pool resource is exhausted.