简体   繁体   English

在 Spring 中链接对 redis 的响应式调用

[英]Chaining reactive calls to redis in Spring

I am trying to get all keys, and then fetch all their values using a ReactiveRedisTemplate in Spring Data Redis我正在尝试获取所有键,然后使用 Spring 数据 Redis 中的ReactiveRedisTemplate获取它们的所有值

(I know that scan is preferable, but I want to keep it simple for now, unless that is my issue) (我知道scan更可取,但我现在想保持简单,除非这是我的问题)

code snnipet:代码片段:

@Service
class Test {
    Logger logger = LoggerFactory.getLogger(Test.class);

    @Autowired
    private ReactiveRedisTemplate<String, String> reactiveRedisTemplate;

    @EventListener(ApplicationReadyEvent.class)
    public void test() {
        logger.info("test");
        var ops = reactiveRedisTemplate.opsForValue();
        var keys = reactiveRedisTemplate.keys("*");
        keys
                .map(l -> {
                    logger.info("test1 " + l);
                    return ops.get(l);
                })
                .doOnNext(
                        l -> logger.info("test2 " + l)
                )
                .blockLast();

        logger.info("done");
    }

}

The problem is that I am getting this output:问题是我得到了这个 output:

test
test1 key1
test2 MonoNext
test1 key2
test2 MonoNext
test1 key3
test2 MonoNext
test1 key4
test2 MonoNext
done

I would expect:我希望:

test
test1 key1
test2 val1
test1 key2
test2 val2
test1 key3
test2 val3
test1 key4
test2 val4
done

I am new to rx-java, so I am probably missing something.我是 rx-java 的新手,所以我可能遗漏了一些东西。

Found the solution...找到了解决方案...

I had to use flatMap instead of map...我不得不使用flatMap而不是 map ......

@Service
class Test {
    Logger logger = LoggerFactory.getLogger(Test.class);

    @Autowired
    private ReactiveRedisTemplate<String, String> reactiveRedisTemplate;

    @EventListener(ApplicationReadyEvent.class)
    public void test() {
        logger.info("test");
        var ops = reactiveRedisTemplate.opsForValue();
        var keys = reactiveRedisTemplate.keys("*");
        keys
                .flatMap(l -> {
                    logger.info("test1 " + l);
                    return ops.get(l);
                })
                .doOnNext(
                        l -> logger.info("test2 " + l)
                )
                .blockLast();

        reactiveRedisTemplate.opsForValue().get("test").doOnNext(l -> logger.info("test2 " + l)).block();

        logger.info("done");
    }

}

full explanation is here完整的解释在这里

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM