我试图从我的应用程序(使用jedis驱动程序用Java编写)中将少量数据(大约50个字节)压入一个有大约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);
}
}
检索(尽管请记住,在插入后,密钥在redis服务器上的redis-cli中显示1-2分钟,所以这段代码从来都不是问题的一部分):
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个成员。这个问题对我来说仍然令人不安,我想确定原因并防止它在未来发生 - 直到那时我无法将其发布到生产环境中。