Java 排序集的Redis插入延迟
我正试图将少量数据(大约50字节)从我的应用程序(使用jedis驱动程序用Java编写)推送到一个有大约360个成员的排序集(每个成员还包含非常少量的数据)。在我的应用程序进行插入和在我的redis服务器(另一个数据中心中的单独服务器)上看到结果之间,我经历了60-90秒的延迟时间。这种情况经常发生。起初,我认为我的应用程序中有某种东西导致查询挂起,然后在一分钟后执行,但事实并非如此,因为我可以在运行查询后立即关闭应用程序服务器,一分钟后新项目仍会在Redis中显示。此外,当我删除集合中的所有元素并再次尝试插入时,它立即发生(这是预期的行为) 这完全是在一个测试环境中进行的,没有其他流量影响任何一台服务器,我的Redis服务器几乎没有任何数据,并且有大量的ram和cpu。我的应用服务器和redis服务器之间的延迟约为50毫秒 是否有我缺少的配置设置可能导致这样的延迟 提前谢谢 编辑:这是我插入的代码Java 排序集的Redis插入延迟,java,redis,jedis,Java,Redis,Jedis,我正试图将少量数据(大约50字节)从我的应用程序(使用jedis驱动程序用Java编写)推送到一个有大约360个成员的排序集(每个成员还包含非常少量的数据)。在我的应用程序进行插入和在我的redis服务器(另一个数据中心中的单独服务器)上看到结果之间,我经历了60-90秒的延迟时间。这种情况经常发生。起初,我认为我的应用程序中有某种东西导致查询挂起,然后在一分钟后执行,但事实并非如此,因为我可以在运行查询后立即关闭应用程序服务器,一分钟后新项目仍会在Redis中显示。此外,当我删除集合中的所有元
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;
}