web-dev-qa-db-ja.com

Jedisタイムアウトを構成する

.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);
11
dranxo

Jedis接続timeoutを設定する場合は、そのために作成された特別なコンストラクターを使用して行う必要があります。

public Jedis(final String Host, final int port, final int timeout)

あなたがしていることは、jedisからredis設定にタイムアウトを設定することです。 CONFIG SET timeout 60を実行すると、redisは60秒後にアイドル状態のクライアント接続を閉じます。そのため、ジェディスでは例外が発生します。

17
xetorthio

これは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を参照してください。

9
Paul-59701

考慮すべき事柄:

  1. JedisクラスとJedisPoolクラスの両方で、タイムアウトはミリ秒単位です。少なくとも2.5.1では、デフォルトのタイムアウトは2000(ミリ秒)です:int redis.clients.jedis.Protocol.DEFAULT_TIMEOUT = 2000 [0x7d0]

  2. this のドキュメントに従って、クライアントがアイドル状態であっても、Redis 2.6以降は接続を閉じません。これはまだ確認していません。確認したら投稿を更新します。

3
milkyway