37

複数のワーカー スレッド (約 10) を実行して、redis Q からデータにアクセスしています。
私はJedis Clientに無限のタイムアウトを使用しています。

Jedis jedis = pool.getResource();
jedis.getClient().setTimeoutInfinite();  

それでも「プールからリソースを取得できませんでした」というエラーが表示されます。スタックトレースを以下に示します。

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:22)
at Workers.Worker1.met1(Worker1.java:124)
at Workers.Worker1.work(Worker1.java:108)
at org.gearman.impl.worker.WorkerConnectionController$3.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)  

Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
at redis.clients.jedis.Connection.connect(Connection.java:124)
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:54)
at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1657)
at redis.clients.jedis.JedisPool$JedisFactory.makeObject(JedisPool.java:63)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1188)
at redis.clients.util.Pool.getResource(Pool.java:20)
... 6 more  

Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at redis.clients.jedis.Connection.connect(Connection.java:119)
... 11 more
4

9 に答える 9

7

Rick Hanlon の回答に基づいて、Spring Boot で Redis を使用すると、この例外もスローされます。

Spring Boot を使用している場合、Redis の依存関係だけでは十分ではありません。また、 redis.ioからマシンに Redis を手動でダウンロードしてインストールし、Bash ターミナルから実行する必要があります。

me@my_pc:/path/to/redis/dir$ ./src/redis-server ./redis.conf

サーバーを実行したら、Redis を使用するすべてのアプリに関連する行を追加する必要があります。

application.properties:

...
spring.redis.host: <yourhost> // usually localhost, but can also be on a LAN
spring.redis.port: <yourport> // usually 6379, but settable in redis.conf

application.yml:

...
spring:
  redis:
    host: <yourhost> // usually localhost, but can also be on a LAN
    port: <yourport> // usually 6379, but settable in redis.conf
于 2016-03-23T08:20:31.070 に答える
3

コードが次のような場合:

JedisPoolConfig jedisPoolConfig = initPoolConfig();    
jedisPool = new JedisPool(jedisPoolConfig, "*.*.*.*", 6379);  

これを試すことができます:

JedisPoolConfig jedisPoolConfig = initPoolConfig();    
jedisPool = new JedisPool(jedisPoolConfig, "*.*.*.*", 6379,10*1000); 

これは、Redis のデフォルトのタイムアウト時間が 2 秒であるためですが、プログラムはこの時間内に実行を終了している可能性があります。

于 2015-03-27T10:36:47.267 に答える
1

確かではありませんが、Jedis オブジェクトをプールに返さず、redis-server に接続制限がある可能性があります。

すべてのワーカー スレッドは、作業が完了した後、Jedis インスタンスをプールに返す必要があります。

Jedis jedis = jedisPool.getResource();
try {
    jedis.getClient().setTimeoutInfinite();
    // your code here...
    ...
} finally {
    jedisPool.returnResource(jedis);
}
于 2012-10-25T20:53:56.417 に答える