gpt4 book ai didi

java - 当尝试通过 jedis 连接器使用错误的 ip 连接 Redis 时,线程等待时间延长的原因是什么?

转载 作者:行者123 更新时间:2023-12-02 12:38:54 28 4
gpt4 key购买 nike

我正在 jedis 连接器的帮助下连接 Redis。我的 redis ip 值位于属性文件中,并将在 jedis 的帮助下进行初始化。执行redis.get的线程正在经历长时间的等待。这是一个示例线程转储

"pool-5-thread-999" #1119 prio=5 os_prio=0 tid=0x00007fa4307ff800 nid=0x4a23 waiting on condition [0x00007fa3d581c000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000a6a006b8> (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.xyz.redis.MyRedisClient.getJedis(MyRedisClient.java:53)
at com.xyz.redis.MyRedisClient.getDataFromRedis(MyRedisClient.java:99)

这个异常的真正含义是什么?

这是redis get getDataFromRedis方法,用于从redis获取数据。

public static String getDataFromRedis(String key) throws Exception {
System.out.println("Entering into get data from redis : "+key);
Jedis jedisCon = null;
try {
jedisCon = getJedis();
jedisCon.select(1);
return jedisCon.get(key);
} catch (Exception e) {
System.out.println("Exception while getting data from redis : " + e.getMessage());
e.printStackTrace();
} finally {
if (jedisCon != null) {
returnJedis(jedisCon);
}
}
return null;
}

这是示例 getJedis() 代码片段

private static Jedis getJedis() {
if (pool == null) {
try{
initRedisClient();
}catch(Exception ex){
System.out.println("Exception while Initializing RedisClient" + ex);
}
}
return pool.getResource();
}

这是初始化部分

public static void initRedisClient() throws Exception {
try {
String propertiesFilePath = "/Users/Ritchie/conf/redis.properties";
Properties redisProps = MyUtils.loadProperties(propertiesFilePath);
JedisPool pool = new JedisPool(redisProps.getProperty("redisserver"));
} catch(Exception ex) {
System.out.println("Thus the occurred exception is : "+ex);
}

因此,当我尝试使用 pool.getResource() 从池中获取 getResource() 且 IP 不正确时,池处于长时间等待状态。

当尝试从注册有错误 IP 的池中获取资源时,为什么线程会长时间等待?

最佳答案

JedisPool 的 Jedis 源代码和 Connection表示您提供的“IP 地址”实际上用于按名称进行主机查找。如果主机在您的 LAN 中不存在且不可用,则此查找将有 15 秒或更长时间的超时。

尝试使用 LAN 中未运行 REDIS 服务器的计算机上的“无效”IP 地址。您现在不应该看到这种长时间的超时。

关于java - 当尝试通过 jedis 连接器使用错误的 ip 连接 Redis 时,线程等待时间延长的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45025730/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com