我正在尝试将少量数据(大约 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 个成员,更新似乎会立即通过。不过,这个问题仍然困扰着我,我想找出原因并防止它在将来发生 - 在那之前我无法将它发布到生产环境中。