.hgetall()
を完了する際に問題が発生しました。これが私が試したことです:
Jedis jedis = new Jedis(REDIS_MASTER_NODE);
jedis.connect();
jedis.configSet("timeout", "30");
Map<String, String> alreadyStored = jedis.hgetAll(redisTargetHash);
そして、ここに私が得るものがあります:
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Java.net.SocketTimeoutException: Read timed out
at redis.clients.jedis.Protocol.process(Protocol.Java:79)
at redis.clients.jedis.Protocol.read(Protocol.Java:131)
at redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.Java:199)
at redis.clients.jedis.Jedis.hgetAll(Jedis.Java:851)
これは問題を解決しました:
Jedis jedis = new Jedis(REDIS_MASTER_NODE, 6379, 1800);
Jedis接続timeout
を設定する場合は、そのために作成された特別なコンストラクターを使用して行う必要があります。
public Jedis(final String Host, final int port, final int timeout)
あなたがしていることは、jedis
からredis設定にタイムアウトを設定することです。 CONFIG SET timeout 60
を実行すると、redisは60
秒後にアイドル状態のクライアント接続を閉じます。そのため、ジェディスでは例外が発生します。
これはxetorthioの回答を少し拡張したものですが、JedisPoolで使用するための同様のアプローチがあります。 (注意:これは、Jedisバージョン2.6.2コードを直接見た私の理解に基づいており、実際の使用例ではテストされていません。)
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxWaitMillis(writeTimeout);
JedisPool pool = new JedisPool(jedisPoolConfig, redisHost, port, readTimeout);
WriteTimeoutは、プールからのJedisリソースが書き込み操作を待機する最大時間です。
プールコンストラクターに指定されたreadTimeoutは、ソケット読み取りの待機時間です。詳細については、Java.net.Socket.setSoTimeout
を参照してください。
考慮すべき事柄:
JedisクラスとJedisPoolクラスの両方で、タイムアウトはミリ秒単位です。少なくとも2.5.1では、デフォルトのタイムアウトは2000(ミリ秒)です:int redis.clients.jedis.Protocol.DEFAULT_TIMEOUT = 2000 [0x7d0]
this のドキュメントに従って、クライアントがアイドル状態であっても、Redis 2.6以降は接続を閉じません。これはまだ確認していません。確認したら投稿を更新します。