【发布时间】:2017-11-30 12:35:51
【问题描述】:
我正在使用 jedis 连接 redis 服务器。 Redis ip 值配置在单独的文件中,我正在尝试在初始化期间加载该文件
private static JedisPool pool;
public static void initRedisClient() throws Exception {
String redisConfigPath = "/conf/redis.properties";
Properties docsRedisProp = RedisUtils.loadProperties(redisConfigPath);
pool = new JedisPool(docsRedisProp.getProperty("redisserver"));
}
}
而我的mget从redis中获取多个key的方法如下
public static List<String> mgetDataFromRedisCache(String[] keys) throws CacheException {
Jedis jedisCon = null;
try {
jedisCon = getJedis();
jedisCon.select(1);
return jedisCon.mget(keys);
} catch (Exception e) {
LOGGER.warning("Exception while fetching data from Redis Client. EXCEPTION=" + e.getMessage());
e.printStackTrace();
} finally {
if (jedisCon != null) {
returnJedis(jedisCon);
}
}
return null;
}
当我在属性文件中提供了不正确的 ip 值时 - 访问它的请求线程正在等待很长时间。我的请求不应该因为池中的资源不可用而停止。
这里我附上了停滞线程(即处于等待状态的线程)的线程转储
###_http-nio-8443-exec-140" #104908 daemon prio=5 os_prio=0 tid=0x00007f247805f000 nid=0x4266 waiting on condition [0x00007f220a4df000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006fe438408> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:524)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:438)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:361)
at redis.clients.util.Pool.getResource(Pool.java:40)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:84)
at com.retail.store.RedisClient.getJedis(RedisClient.java:53)
at com.retail.store.RedisClient.mgetDataFromRedisCache(RedisClient.java:82)
我怎样才能做到这一点?任何帮助深表感谢。在此先感谢:-)
【问题讨论】:
-
您是否发现了有关此主题的任何信息?我们在将 redis 与 spring-data-redis 一起使用时遇到了同样的问题(但也有 Jedis 作为客户端)
-
@woezelmann 设置
setMaxWaitMillis帮助了我。在下面的回答中解释了我..请调查一下。希望有帮助!!
标签: java multithreading redis jedis