【发布时间】:2019-01-22 18:52:20
【问题描述】:
我正在使用spring boot webflux + project reactor + lettuce 以非阻塞方式连接和查询 Redis。
我已经用LettuceConnectionFactory 配置了ReactiveRedisTemplate。 spring 文档指出,使用ReactiveRedisTemplate 的管道的唯一方法是使用execute(<RedisCallback>) 方法。在非反应式RedisTemplate 中,我看到有一个executePipelined(<RedisCallback>) 方法可以在执行回调之前打开/关闭管道。但是对于ReactiveRedisTemplate.execute 方法,它使用LettuceReactiveRedisConnection 并且Spring ReactiveRedisConnection 和Lettuce 都没有引用管道。
所以我的问题是,是否可以在使用 Spring ReactiveRedisTemplate + ReactiveLettuceConnection 时对您的命令进行管道化?
我还注意到,将 ReactiveRedisTemplate.execute 与具有多个 Redis 命令的 RedisCallback 一起使用比单独调用命令要慢。
带有 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();
谢谢!
【问题讨论】:
-
我遇到了同样的问题,已经谷歌搜索了 1 周没有结果,您有什么解决方案吗?
-
@kriver。您找到问题的答案了吗?请更新答案
标签: redis reactive-programming project-reactor spring-data-redis lettuce