问题情形
当在执行Redis一直指令时,有可能会遇见如下几种错误:
1) redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
2) redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
3) JedisTemplate.execute - Redis connection lost.
以上三种错误,在详细的Stack Trace中,其引起的根本异常情况都是 java.net.SocketTimeoutException: Read timed out。 具体原因时在执行指令时候超时。 所以这里要从执行的命令和Redis服务器的Server Load来判断问题。
解决办法
修改Jedis的默认超时时间(2秒)。如果执行的命令时KEYS等比较耗时的操作,可以考虑增加到3~5秒为超时时间。但时最好的办法还是不要使用KEYS等命令,根据Redis官方网站的介绍,可以使用SCEN来替换。
修改初始化JedisPool时的Timeout时间。
JedisPool(GenericObjectPoolConfig poolConfig, String host, int port, int timeout)
参考资料:
java.net.SocketTimeoutException: Read timed out:https://github.com/xetorthio/jedis/wiki/FAQ#if-you-get-javanetsockettimeoutexception-read-timed-out-exception (如不能访问Github链接,可点击:[Azure Redis]If you get java.net.SocketTimeoutException: Read timed out exception)