Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 排序集的Redis插入延迟_Java_Redis_Jedis - Fatal编程技术网

Java 排序集的Redis插入延迟

Java 排序集的Redis插入延迟,java,redis,jedis,Java,Redis,Jedis,我正试图将少量数据(大约50字节)从我的应用程序(使用jedis驱动程序用Java编写)推送到一个有大约360个成员的排序集(每个成员还包含非常少量的数据)。在我的应用程序进行插入和在我的redis服务器(另一个数据中心中的单独服务器)上看到结果之间,我经历了60-90秒的延迟时间。这种情况经常发生。起初,我认为我的应用程序中有某种东西导致查询挂起,然后在一分钟后执行,但事实并非如此,因为我可以在运行查询后立即关闭应用程序服务器,一分钟后新项目仍会在Redis中显示。此外,当我删除集合中的所有元

我正试图将少量数据(大约50字节)从我的应用程序(使用jedis驱动程序用Java编写)推送到一个有大约360个成员的排序集(每个成员还包含非常少量的数据)。在我的应用程序进行插入和在我的redis服务器(另一个数据中心中的单独服务器)上看到结果之间,我经历了60-90秒的延迟时间。这种情况经常发生。起初,我认为我的应用程序中有某种东西导致查询挂起,然后在一分钟后执行,但事实并非如此,因为我可以在运行查询后立即关闭应用程序服务器,一分钟后新项目仍会在Redis中显示。此外,当我删除集合中的所有元素并再次尝试插入时,它立即发生(这是预期的行为)

这完全是在一个测试环境中进行的,没有其他流量影响任何一台服务器,我的Redis服务器几乎没有任何数据,并且有大量的ram和cpu。我的应用服务器和redis服务器之间的延迟约为50毫秒

是否有我缺少的配置设置可能导致这样的延迟

提前谢谢

编辑:这是我插入的代码

public void save(RedisEntity entity) {
    String key = entity.getKey();
    String value = entity.getValue();
    Jedis jedis = database.getJedis();

    try {
        if (entity instanceof RedisListEntity) {
            if (((RedisListEntity)entity).isSavePushesLeft()) {
                jedis.lpush(key, value);
            } else {
                jedis.rpush(key, value);
            }
        } else if (entity instanceof RedisSortedSetEntity) {
            Long score = ((RedisSortedSetEntity)entity).getScore();
            jedis.zadd(key, score, value);
        } else if (entity instanceof RedisSetEntity) {
            jedis.sadd(key, value);
        } else {
            jedis.set(key, value);
        }
    } catch (JedisConnectionException e) {
        raiseErrorForSave(key, value);
        database.returnBrokenResourceToPool(jedis);
    } finally {
        database.returnResourceToPool(jedis);
    }
}
和检索(尽管请记住,密钥在插入后的1-2分钟内不会显示在redis服务器上的redis cli中,因此此代码从来都不是问题的一部分):

public Set getSortedSetMembersWithRangeRankRev(字符串键,双最小值,双最大值,整数开始,整数大小){
设置结果=null;
绝地武士=数据库。getJedis();
试一试{
结果=jedis.zrevrangeByScore(键、最大值、最小值、开始值、大小);
}捕获(绝地连接异常e){
logger.warn(“无法检索键+键的设置”);
logger.warn(例如getMessage());
数据库:returnBrokenResourceToPool(绝地);
}最后{
数据库:returnResourceToPool(绝地);
}
返回结果;
}

编辑:更多信息-我重新启动了我的Redis服务器,它已经运行了几天(在开发环境中几乎没有流量),更新似乎是在集达到1000个成员时立即完成的。不过,这个问题仍然困扰着我,我想找出原因并防止它在将来发生——在那之前,我无法将其发布到生产环境中。

您可以发布您的java代码,并使用jedis interaction进行写和读吗?是的,刚刚添加了代码您有一些日志要显示吗?如果没有,我建议在redis上使用监管,有很多,比如RedisLive或RedisMunin、supervisord……目前还没有。谢谢你,我会尝试一下,如果我发现新的信息,会告诉你的。
public Set<String> getSortedSetMembersWithRangeRankRev(String key, double min, double max, int start, int size) {
    Set<String> result = null;
    Jedis jedis = database.getJedis();

    try {
        result = jedis.zrevrangeByScore(key, max, min, start, size);
    } catch (JedisConnectionException e) {
        logger.warn("Failed to retrieve set for key " + key);
        logger.warn(e.getMessage());
        database.returnBrokenResourceToPool(jedis);
    } finally {
        database.returnResourceToPool(jedis);
    }
    return result;
}