Spring Data Redis - 质量插入

时间:2018-02-07 21:36:55

标签: java spring redis lettuce

我有以下问题:

我有一个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秒)...... 我的主要问题是......我可以应用哪些改进来改善性能? 也许对数据进行分区,并一次发送预定义数量的值?我还能尝试什么?

1 个答案:

答案 0 :(得分:0)

几周前我遇到了同样的问题。

性能下降可能是由多种原因造成的。

首先,我建议排除网络问题。 This article有助于理解延迟问题的原因。另外,如果您使用的是远程Redis实例,请尝试评估使用本地实例的操作时间。

第二,您绝对可以尝试redission。当我遇到Jedis和生菜的性能问题时,这对我很有帮助,并且它们的API很棒。而且它们还具有PRO版本(在某些情况下快44倍)。

另一个原因可能是序列化/反序列化部分。 您可以查看Redisson中使用的codecs,并在您的应用程序中使用它们(您知道FstCodec很快)。