使用springcache只读,如何设置springcacheredis只读

Ton*_*ing 1 spring-cache

当我在redis中使用spring缓存时,我在两个应用程序中使用它,一个是读写,另一个是只读,我该如何配置?

我尝试这样做,但它不起作用!

@Cacheable(value = "books", key = "#isbn", condition = "false")
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

Joh*_*lum 6

@Cacheable您误解了注释的“ ”属性的用途condition。根据文档...

如果为 true,则该方法将被缓存 - 如果不是,则其行为就像该方法未缓存一样,从那时起每次都会执行该方法,无论缓存中的值是什么或使用什么参数。

condition属性只是确定在执行(可能昂贵的)方法之前是否首先查阅缓存(例如Redis)。如果condition计算结果为false,则该方法将始终被执行,并且结果随后被缓存。

在只读应用程序中,我假设您希望首先查阅缓存,如果该值不在缓存中,则执行该方法,但是,不要缓存结果。它是否正确?

如果是这样,那么您只需要指定unless属性而不是像condition这样指定属性......

@Cacheable(value="books", key="#isbn", unless="true")
void someBookMutatingOperation(String isbn, ...) { .. }
Run Code Online (Sandbox Code Playgroud)

但是,如果您想完全避免只读(版本)应用程序中的可缓存方法调用,而只是查询缓存,而不管缓存中是否实际存在值,那么您的问题就更多了复杂/困难。

Spring 的缓存抽象的运行前提是,如果一个值不在缓存中,那么它将返回 null 来指示缓存未命中,然后进行后续的方法调用。仅当缓存返回指定键的值时,才会避免方法调用。

如果没有自定义扩展(可能使用(附加的)AOP 拦截器),则无法避免 OOTB 行为。

除非您的用例需要,否则我不会详细说明后面的技术。

希望这可以帮助。