我有以下问题:
我有一个Java服务从队列读取并将数据推送到Redis(SADD)。我们最初使用的是Jedis,但我想试试生菜。 现在我面临一些性能问题,我认为这是因为我们正在推动的数据量。
我们使用spring数据redis,我们有一个Java POJO,我们存储为JSON。我们要插入的代码如下:
public void add(final UUID uuid, final MyPojo... values) {
final String key = getKey(uuid);
final long startTime = System.currentTimeMillis();
final List<Object> response = redisTemplate.executePipelined(new SessionCallback<List<Object>>() {
@Override
public <K, V> List<Object> execute(final RedisOperations<K, V> operations) throws DataAccessException {
final BoundSetOperations setOperations = operations.boundSetOps((K) key);
setOperations.add(values);
setOperations.expire(expiration, expirationUnit);
return null;
}
});
final Long added = (Long) response.get(0);
final Boolean expirationSet = (Boolean) response.get(1);
if (added != values.length || !expirationSet) {
final String msg = String.format("Error executing commands: Added %d, expected = %d. Expiration set = %b", added, values.length, expirationSet);
throw new DataIntegrityViolationException(msg);
}
if (log.isInfoEnabled()) {
log.info("add took = {} millis", (System.currentTimeMillis() - startTime));
}
}
Connection工厂看起来像:
final ClientResources clientResources = DefaultClientResources.builder()
.ioThreadPoolSize(4)
.computationThreadPoolSize(4)
.build();
final LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory();
connectionFactory.setHostName(getRedis().getHostname());
connectionFactory.setPort(getRedis().getPort());
connectionFactory.setShareNativeConnection(true);
connectionFactory.setTimeout(30000);
connectionFactory.setClientResources(clientResources);
一些SADD操作耗时太长(大约10秒)...... 我的主要问题是......我可以应用哪些改进来改善性能? 也许对数据进行分区,并一次发送预定义数量的值?我还能尝试什么?
答案 0 :(得分:0)
几周前我遇到了同样的问题。
性能下降可能是由多种原因造成的。
首先,我建议排除网络问题。 This article有助于理解延迟问题的原因。另外,如果您使用的是远程Redis实例,请尝试评估使用本地实例的操作时间。
第二,您绝对可以尝试redission。当我遇到Jedis和生菜的性能问题时,这对我很有帮助,并且它们的API很棒。而且它们还具有PRO版本(在某些情况下快44倍)。
另一个原因可能是序列化/反序列化部分。 您可以查看Redisson中使用的codecs,并在您的应用程序中使用它们(您知道FstCodec很快)。