Java 莴苣I';我发现redis集群上的异步mget比流水线要慢得多
我正在为一个新项目编写一些基准测试,我遇到了一个问题,莴苣(5.1.3版)和我在下面找到了使用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
@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-莴苣的竞争者有一个实现,您可以参考: