我在jedis的帮助下连接我的redis。而jedis池的初始化就像是,
JedisPool pool = new JedisPool("<redis_server_ip_address>");
和redis get call就像
Jedis jedis = pool.getResource();
jedis.get(key);
因此,这里使用默认池配置
初始化池此池初始化具有正确的ip值和默认池配置。当在初始化期间给出一些不正确的ip值时Jedis
无法找到不正确的ip值,因此在pool.getResource()
调用期间,线程进入等待状态,即;将建立连接,并且当请求超过maxactiveconnections
的{{1}}的{{1}}时,进一步redis get class的线程将进入线程8
halt
状态。这意味着线程既没有提供执行,也没有选择在队列中等待 - 这将被推送到暂停状态,并且处于暂停状态的线程的线程转储样本如下所示
WAITING
线程将处于暂停状态,直到先前尝试连接redis的请求完成并调用此等待线程(即;当它 Thread 956: (state = IN_NATIVE)
- java.net.PlainSocketImpl.socketConnect(java.net.InetAddress, int, int) @bci=0 (Interpreted frame)
- java.net.AbstractPlainSocketImpl.doConnect(java.net.InetAddress, int, int) @bci=64, line=350 (Interpreted frame)java.net.AbstractPlainSocketImpl.connectToAddress(java.net.InetAddress, int, int) @bci=23, line=206 (Interpreted frame)
- java.net.AbstractPlainSocketImpl.connect(java.net.SocketAddress, int) @bci=78, line=188 (Interpreted frame)
- java.net.SocksSocketImpl.connect(java.net.SocketAddress, int) @bci=381, line=392 (Interpreted frame)
- java.net.Socket.connect(java.net.SocketAddress, int) @bci=179, line=589 (Interpreted frame)
- redis.clients.jedis.Connection.connect() @bci=74, line=144 (Interpreted frame)
- redis.clients.jedis.BinaryClient.connect() @bci=8, line=71 (Compiled frame)
- redis.clients.jedis.BinaryJedis.connect() @bci=4, line=1783 (Interpreted frame)
- redis.clients.jedis.JedisFactory.makeObject() @bci=21, line=65 (Interpreted frame)
- org.apache.commons.pool2.impl.GenericObjectPool.create() @bci=47, line=836 (Interpreted frame)
- org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(long) @bci=92, line=434 (Compiled frame)
- org.apache.commons.pool2.impl.GenericObjectPool.borrowObject() @bci=5, line=361 (Compiled frame)
- redis.clients.util.Pool.getResource() @bci=4, line=40 (Compiled frame)
- redis.clients.jedis.JedisPool.getResource() @bci=1, line=84 (Compiled frame)
- com.project.SampleRedisClient.getJedis() @bci=41, line=53 (Interpreted frame)
- com.project.SampleRedisClient.getDataFromRedis(java.lang.String) @bci=27, line=99 (Interpreted frame)
调用这些等待线程时)
所以,我所做的只是添加interupt()
,用于在连接redis时设置其他配置。我正在添加JedisPoolConfig
,允许我设置等待时间。因此,将为处于maxWaitSeconds
等待状态的线程设置超时。这解决了我延长线程等待的问题(正如我的线程转储堆栈跟踪显示)。
最新的halt
池初始化如下所示,
Jedis
那么,这个JedisPool配置是什么。这String host = docsRedisProp.getProperty("redisserver");
int port = 6379;
int maxActiveConnections = 8;
int maxWaitInMillis = 2000;
JedisPoolConfig jedisConfig = new JedisPoolConfig();
jedisConfig.setMaxTotal(maxActiveConnections);
jedisConfig.setMaxWaitMillis(maxWaitInMillis);
pool = new JedisPool(jedisConfig, host, port);
到底是做什么的?
当ip不正确时,线程会有什么机会连接?什么是连接状态?这里的连接是JedisPoolConfig.setMaxWaitMillis
还是ESTABLISHED
状态?
这些连接何时关闭(即;有机会连接到redis ip的线程)?
如何通过terminal命令查看当前建立到redis服务器的总连接?
这个OPEN
是指什么?这是否一次只允许最多maxActiveConnections
个连接?
使用以下终端命令
netstat -a -n -p -l | grep&#34;&#34;
有了这个,当正确给出redis ip值时,我可以找到几个处于8
状态的连接。