15

の完了に問題があり.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);
4

3 に答える 3

22

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

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

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

于 2013-02-21T11:12:43.103 に答える
10

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

于 2015-02-12T00:10:28.190 に答える
4

考慮すべき点はほとんどありません。

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

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

于 2016-07-14T19:34:23.253 に答える