如何使用Mono的“缓存”方法

SoT*_*SoT 16 caching reactive-programming project-reactor spring-webflux webflux

我是 spring webflux 的初学者。在研究时我发现了一些代码,例如:

Mono result = someMethodThatReturnMono().cache();
Run Code Online (Sandbox Code Playgroud)

“缓存”这个名字告诉我关于缓存某些东西,但是缓存在哪里以及如何检索缓存的东西?是咖啡因之类的东西吗?

ras*_*cio 26

它缓存 Flux/Mono 前面步骤的结果,直到cache()调用该方法为止,检查此代码的输出以查看其实际效果:

import reactor.core.publisher.Mono;

public class CacheExample {

    public static void main(String[] args) {
        var mono = Mono.fromCallable(() -> {
            System.out.println("Go!");
            return 5;
        })
        .map(i -> {
            System.out.println("Double!");
            return i * 2;
        });

        var cached = mono.cache();

        System.out.println("Using cached");

        System.out.println("1. " + cached.block());
        System.out.println("2. " + cached.block());
        System.out.println("3. " + cached.block());

        System.out.println("Using NOT cached");


        System.out.println("1. " + mono.block());
        System.out.println("2. " + mono.block());
        System.out.println("3. " + mono.block());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Using cached
Go!
Double!
1. 10
2. 10
3. 10
Using NOT cached
Go!
Double!
1. 10
Go!
Double!
2. 10
Go!
Double!
3. 10
Run Code Online (Sandbox Code Playgroud)

  • 不,我的意思是在同一 HTTP 请求范围内进行计算,而不是在多个 HTTP 请求之间共享。要跨不同请求实现缓存,您需要一些其他缓存机制,Mono/Flux 缓存在其他上下文中也称为 **memoization** (3认同)