【发布时间】:2018-07-18 07:47:33
【问题描述】:
我有以下问题:
我有一个 Java 服务,它从队列中读取数据并将数据推送到 Redis (SADD)。我们最初使用 Jedis,但我想尝试生菜。 现在我面临一些性能问题,我认为这是因为我们推送的数据量很大。
我们使用 spring data 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));
}
}
连接工厂如下所示:
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 秒)... 我的主要问题是......我可以应用任何改进来提高性能吗? 也许对数据进行分区,并一次发送预定义数量的值?我还能尝试什么?
【问题讨论】: