【问题标题】:Spring Data Redis - Mass InsertsSpring Data Redis - 批量插入
【发布时间】: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 秒)... 我的主要问题是......我可以应用任何改进来提高性能吗? 也许对数据进行分区,并一次发送预定义数量的值?我还能尝试什么?

【问题讨论】:

    标签: java spring redis lettuce


    【解决方案1】:

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

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

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

    其次,你绝对可以试试redission。当我遇到 Jedis 和 lettuce 的性能问题时,这对我很有帮助,而且他们的 API 很棒。他们也有 PRO 版本(在某些情况下速度快 44 倍)。

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

    【讨论】:

      猜你喜欢
      • 2018-01-23
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 2012-09-23
      • 2016-07-21
      • 2020-03-18
      • 1970-01-01
      相关资源
      最近更新 更多