我正在使用 spring boot webflux
+ project reactor
+ lettuce
以非阻塞方式连接和查询Redis。
我已经使用 LettuceConnectionFactory
配置了 ReactiveRedisTemplate
。Spring文档说明,使用流水线的唯一方法是使用 execute(<RedisCallback>)
方法。在非反应式的 RedisTemplate
中,我看到有一个 executePipelined(<RedisCallback>)
方法,在执行回调之前打开/关闭管道。但是,在 ReactiveRedisTemplate.execute
方法的情况下,它使用 LettuceReactiveRedisConnection
,而不是 Spring ReactiveRedisConnection
或 Lettuce
没有参考流水线。
因此,我的问题是,在使用 Spring ReactiveRedisTemplate
+ ReactiveLettuceConnection
时是否可能对命令进行流水线处理?
我还注意到,使用具有多个Redis命令的 RedisCallback
的 ReactiveRedisTemplate.execute
比单独调用命令执行得更慢。
使用 ReactiveRedisTemplate 进行流水线处理的示例代码:
reactiveRedisTemplate.execute(connection -> keys.flatMap(key ->
connection.hashCommands()
.hGetAll(ByteBuffer.wrap(key.getBytes()))))
.map(Map.Entry::getValue)
.map(ByteUtils::getBytes)
.map(b -> {
try {
return mapper.readValue(b, Value.class);
} catch (IOException e1) {
return null;
}
})
.collectList();
没有流水线的代码:
keys.flatMap(key -> reactiveRedisTemplate.opsForHash().entries(key))
.map(Map.Entry::getValue)
.cast(Value.class)
.collectList();
谢谢!