当我在redis中使用spring缓存时,我在两个应用程序中使用它,一个是读写,另一个是只读,我该如何配置?
我尝试这样做,但它不起作用!
@Cacheable(value = "books", key = "#isbn", condition = "false")
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
@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 行为。
除非您的用例需要,否则我不会详细说明后面的技术。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
3471 次 |
| 最近记录: |