Java 弹簧数据Redis-质量插入

Java 弹簧数据Redis-质量插入,java,spring,redis,lettuce,Java,Spring,Redis,Lettuce,我有以下问题: 我有一个Java服务从队列读取数据并将数据推送到Redis(SADD)。我们最初用的是绝地武士,但我想尝试一下。 现在我面临一些性能问题,我认为这是因为我们正在推送的数据量 我们使用SpringDataRedis,我们有一个JavaPOJO,存储为JSON。我们必须执行插入的代码如下所示: public void add(final UUID uuid, final MyPojo... values) { final String key = getKey(uui

我有以下问题:

我有一个Java服务从队列读取数据并将数据推送到Redis(SADD)。我们最初用的是绝地武士,但我想尝试一下。 现在我面临一些性能问题,我认为这是因为我们正在推送的数据量

我们使用SpringDataRedis,我们有一个JavaPOJO,存储为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秒)。。。 我的主要问题是。。。我可以申请任何改进来提高绩效吗?
可能会对数据进行分区,并一次发送预定义数量的值?我还可以试试别的吗?

几周前我也有同样的问题

性能损失可能由多种原因造成

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

第二,你绝对可以试试。当我遇到绝地武士和莴苣的性能问题时,这对我很有帮助,而且他们的API很棒。而且他们也有专业版(在某些情况下,速度要快44倍)

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