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);
If what you want to do is set Jedis connection
timeout
, you should do it using the special constructor made for that:What you are doing is setting the timeout on redis settings from
jedis
. DoingCONFIG SET timeout 60
, means that redis will close idle client connections after60
seconds. That's why you get the exception in Jedis.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.)
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.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.