Configure Jedis timeout

匿名 (未验证) 提交于 2019-12-03 03:06:01

问题:

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) 

Ok,

Jedis jedis = new Jedis(REDIS_MASTER_NODE, 6379, 1800); 

did it.

回答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.



回答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.



回答3:

Few things to consider:

  1. 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]

  2. As per this documentation, recent version of Redis 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.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!