1

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

这完全是在一个测试环境中,没有其他流量访问任何一个服务器,我的 Redis 服务器几乎没有任何数据,并且有大量的内存和 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<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;
}

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

4

0 回答 0