【问题标题】:JedisConnectionException Read Time OutJedisConnectionException 读取超时
【发布时间】:2018-02-01 04:21:25
【问题描述】:

我在我的 Java 程序中使用 jedis。它的版本是 2.9.0

         <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
            <type>jar</type>
        </dependency>

为了避免通过命令keys(*) 查询结果花费太多时间,我将键存储在一个集合中,当需要所有键时,使用以下命令从集合中查询它们:

public Set<String> getKeysFromDailySet(String day) {
    Jedis jedis = jedisPool.getResource();
    Set<String> keys = new HashSet<>();
    try {
        keys = jedis.smembers(day);
        jedis.close();
    } catch (Exception e) {
        logger.error("fail get keys from daily set {}", day);
    }
    return keys;
}

集合中大约有 800 万 个键,它会抛出超时异常:

  Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
            at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:202) ~[scoring-20180118.jar:na]
            at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40) ~[scoring-20180118.jar:na]
            at redis.clients.jedis.Protocol.process(Protocol.java:151) ~[scoring-20180118.jar:na]
            at redis.clients.jedis.Protocol.read(Protocol.java:215) ~[scoring-20180118.jar:na]
            at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340) ~[scoring-20180118.jar:na]
            at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:239) ~[scoring-20180118.jar:na]
            at redis.clients.jedis.BinaryJedis.select(BinaryJedis.java:523) ~[scoring-20180118.jar:na]
            at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:111) ~[scoring-20180118.jar:na]
            at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868) ~[scoring-20180118.jar:na]
            at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435) ~[scoring-20180118.jar:na]
            at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) ~[scoring-20180118.jar:na]
            at redis.clients.util.Pool.getResource(Pool.java:49) ~[scoring-20180118.jar:na]
            ... 9 common frames omitted
    Caused by: java.net.SocketTimeoutException: Read timed out
            at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.7.0_80]
            at java.net.SocketInputStream.read(SocketInputStream.java:152) ~[na:1.7.0_80]
            at java.net.SocketInputStream.read(SocketInputStream.java:122) ~[na:1.7.0_80]
            at java.net.SocketInputStream.read(SocketInputStream.java:108) ~[na:1.7.0_80]
            at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:196) ~[scoring-20180118.jar:na]

这是我的 JedisPool 配置:

private final int HOUR_IN_SECONDS = 3600 * 10;  // 10 HOURS
private final Configuration config;
private final int INDEX;

public DatabaseConnection(String host, Configuration config) {
    this.config = config;
    this.INDEX = config.getRedisDbIndex();
    jedisPool = new JedisPool(buildJedisPoolConfiguration(), host, 6379, HOUR_IN_SECONDS, null, INDEX);
}

private JedisPoolConfig buildJedisPoolConfiguration() {
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    jedisPoolConfig.setMaxTotal(this.config.getNumberOfThreads());
    return jedisPoolConfig;
}

我已将超时设置为 10 小时,但错误发生在 1 小时内。我从 github 阅读了 Jedis,但没有找到适合我的案例的样本。任何人都可以帮忙吗?谢谢!

【问题讨论】:

    标签: java redis timeout jedis


    【解决方案1】:

    JedisPool 以毫秒为单位超时。所以你给定的超时时间实际上是 36 秒,而不是 10 小时。

    进一步说明,您应该考虑使用具有较小批量大小的SSCAN,而不是对一组 800 万成员运行 SMEMBERS

    【讨论】:

    • 谢谢!我检查了SSCAN,效果很好!我的不好,以毫秒为秒,很难找到绝地文档...
    猜你喜欢
    • 2019-09-18
    • 2020-01-19
    • 2014-08-06
    • 2019-08-20
    • 2014-06-06
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多