Redis 将多个反应式发布服务器/Flux/Mono对象组合到阻塞请求中

Redis 将多个反应式发布服务器/Flux/Mono对象组合到阻塞请求中,redis,reactive-programming,project-reactor,lettuce,Redis,Reactive Programming,Project Reactor,Lettuce,我对被动的世界非常陌生,并且努力理解如何完成一项任务。我正在从事一个遗留项目,在这个项目中,我必须实现一个接口,该接口有许多方法可以从redis查询各种对象。有时查询就像按ID查询哈希一样简单,因此只需调用redis即可获得哈希。其他时候,我可能需要首先根据一些参数从redis集合中查找ID,然后使用结果ID获取哈希。我在Spring Boot应用程序中使用Reactor 3.1.0.M3和莴苣5.0.0.RC1 我为这两个示例方法编写的现有代码如下所示: public <T ex

我对被动的世界非常陌生,并且努力理解如何完成一项任务。我正在从事一个遗留项目,在这个项目中,我必须实现一个接口,该接口有许多方法可以从redis查询各种对象。有时查询就像按ID查询哈希一样简单,因此只需调用redis即可获得哈希。其他时候,我可能需要首先根据一些参数从redis集合中查找ID,然后使用结果ID获取哈希。我在Spring Boot应用程序中使用Reactor 3.1.0.M3和莴苣5.0.0.RC1

我为这两个示例方法编写的现有代码如下所示:

    public <T extends CatalogInfo> T get(String id, Class<T> clazz) {
        String result = (String)repository.getRedisHashRepository().getHashById(CatalogUtils.root(clazz).getSimpleName(), id);
        if (null != result) {
            return serializer.fromData(result, clazz);
        }
        return null;

    }

    public <T extends CatalogInfo> T get(String attName, String attValue, Class<T> clazz) {

        String attKey = CatalogUtils.buildKey(CatalogUtils.root(clazz), attName, attValue);

        String id = CatalogUtils.getIdFromSet(repository.getRedisSetRepository().getSetMembers(attKey));
        if (id == null) {
            return null;
        }
        return get(id, clazz);
    }
private Function<String, Flux<String>> getIdFromSetFunction = new Function<String, Flux<String>>() {
        @Override
        public Flux<String> apply(String attKey) {
            return commands.smembers(attKey);
        }
    }; 
唯一的问题是在这些函数中执行的代码需要当前在方法调用中可用的类信息。但我不确定这是正确的方法

任何建议都将不胜感激

从概念上讲,您不是“组合单声道对象”,而是“为每个步骤创建一个新对象”

Mono a=Mono.just(“某物”);
monob=a.flatMap->godosomethingelsethatraturnsamono;
字符串结果=b.block();
你可以像那样继续用链子拴你想要的东西。(如果要单独处理多个数据项,可以使用
Mono.flatMapMany
进入
Flux
世界)


在调用
block
之前,不会发生任何事情,因为它订阅
b
并阻止当前线程,直到结果可用。

你一直在帮助我作为一个新手进入被动世界。谢谢你的回答!
public <T extends CatalogInfo> Flux<String> getIdFromSetReactive(String attName, String attValue, Class<T> clazz) {
    String attKey = CatalogUtils.buildKey(CatalogUtils.root(clazz), attName, attValue);

    Flux<String> flux = Flux.just(attKey).flatMap(new Function<String, Flux<String>>() {
        @Override
        public Flux<String> apply(String attKey) {
            return commands.smembers(attKey);
        }
    }).flatMap(new Function<String, Publisher<String>>() {
        @Override
        public Publisher<String> apply(String id) {
            return hashCommands.hget(CatalogUtils.root(clazz).getSimpleName(), id);
        }
    });
    return flux;
} 
private Function<String, Flux<String>> getIdFromSetFunction = new Function<String, Flux<String>>() {
        @Override
        public Flux<String> apply(String attKey) {
            return commands.smembers(attKey);
        }
    }; 
return Flux.just(attKey).flatMap(getIdFromSetFunction).flatMap(getHash);
Mono<String> a = Mono.just("something");
Mono<String> b = a.flatMap( s -> goDoSomethingElseThatReturnsAMono(s));

String result = b.block();