Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 莴苣I';我发现redis集群上的异步mget比流水线要慢得多_Java_Performance_Redis_Lettuce - Fatal编程技术网

Java 莴苣I';我发现redis集群上的异步mget比流水线要慢得多

Java 莴苣I';我发现redis集群上的异步mget比流水线要慢得多,java,performance,redis,lettuce,Java,Performance,Redis,Lettuce,我正在为一个新项目编写一些基准测试,我遇到了一个问题,莴苣(5.1.3版)和我在下面找到了使用mget的代码: @Override public Set<V> getKeys(final Set<Long> keySet) { try { return asyncCommands.mget(keySet.toArray(new Long[0])).get( 5, TimeUnit.SECONDS

我正在为一个新项目编写一些基准测试,我遇到了一个问题,莴苣(5.1.3版)和我在下面找到了使用mget的代码:

 @Override
public Set<V> getKeys(final Set<Long> keySet) {

    try {
        return asyncCommands.mget(keySet.toArray(new Long[0])).get(
                5, TimeUnit.SECONDS
        ).stream().map(keyValue -> keyValue.getValue()).collect(Collectors.toSet());
    }  catch (Exception e) {
        throw new RuntimeException(e);
    }
@覆盖
公共设置getKeys(最终设置密钥集){
试一试{
返回asyncCommands.mget(keySet.toArray(新长[0])).get(
5,时间单位。秒
).stream().map(keyValue->keyValue.getValue()).collect(collector.toSet());
}捕获(例外e){
抛出新的运行时异常(e);
}
要比我自己使用管道传输慢很多(比如慢100倍以上):

List<RedisFuture<V>> futures = new ArrayList<>(keySet.size());
    keySet.forEach(
            key -> futures.add(asyncCommands.get(key))
    );

    asyncCommands.flushCommands();

    LettuceFutures.awaitAll(5, TimeUnit.SECONDS,
        futures.toArray(new RedisFuture[0]));

    final Set<V> collect = futures.stream().map(
            future -> {
                try {
                    return future.get(1, TimeUnit.SECONDS);
                } catch (Exception e) {
                    log.warn("", e);
                    throw new RuntimeException();
                }
            }
    ).filter(
            Objects::nonNull
    ).collect(Collectors.toSet());
    return collect;
List futures=newarraylist(keySet.size());
键集forEach(
key->futures.add(asyncCommands.get(key))
);
asyncCommands.flushCommands();
等待所有(5,时间单位:秒,
期货.toArray(新期货[0]);
最终集合collect=futures.stream().map(
未来->{
试一试{
返回future.get(1,TimeUnit.SECONDS);
}捕获(例外e){
log.warn(“,e);
抛出新的RuntimeException();
}
}
).过滤器(
对象::非空
).collect(收集器.toSet());
回款到付;
与redis服务器报告的内容相比,这两个方面似乎都非常慢,但可能还有其他因素。javadocs说mget应该使用管道,那么为什么它比我自己使用管道时慢得多?我做得不对吗

编辑:对于mget,我已启用autoflushcommands,对于管道,它已禁用


更新:发现性能低下的罪魁祸首是编解码器太慢,有没有办法在编解码器太慢时提高整体吞吐量?

你是如何实现编解码器的?数据是序列化的协议缓冲区数据,所以我只调用协议缓冲区java库提供的反序列化方法并传入一个字节ar我从ByteBuffer中得到的ray,大致如下:
publicMyProtobufClass decodeValue(最终ByteBufferBytes){returnMyProtobufClass.parseFrom(新的ByteBufferBackedInputStream(bytes);}
在我的案例中,我看到Kryo的表现比protobufs好。如果您有机会尝试不同的代码,我建议您尝试一下Kryo。Redisson-莴苣的竞争者有一个实现,您可以参考: