在缓存中找不到但不缓存结果时如何使@Cacheable返回null?

Posted

技术标签:

【中文标题】在缓存中找不到但不缓存结果时如何使@Cacheable返回null?【英文标题】:How to make @Cacheable return null when not found in cache but do not cache the result? 【发布时间】:2015-06-30 08:43:32 【问题描述】:

遵循@Cacheable注解

@Cacheable(value="books", key="#isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
根据键在缓存中查找 如果找到则从缓存中返回结果 如果没有找到评估方法 更新缓存 返回结果

这样下次使用相同的参数调用此方法时,将从缓存中获取它。

我想要的只是

根据key在缓存中查找 如果找到则从缓存中返回结果 如果没有找到返回null

我不想在缓存未命中的情况下更新缓存,有没有办法使用 spring Annotation 来做到这一点

【问题讨论】:

这不是 @Cacheable 注释的真正用例,而且它根本不是一个常见的用例,所以我猜不,你不能用 spring 做到这一点注释,并且您必须自己编写 findBookInCache(ISBN isbn) 方法。 【参考方案1】:

这就是我最终得到的结果,诀窍是使用“除非”对我们有利

@Cacheable(value="books", key="#isbn", unless = "#result == null")
public Book findBookFromCache(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

    return null;

这个方法

根据键在缓存中查找 如果找到则从缓存中返回结果 如果未找到,则评估返回 null 的方法 返回值与除非条件匹配(总是返回真) 空值不被缓存 空值返回给调用者

【讨论】:

嗨,我有一个场景,结果是异常,除非我的代码中没有配置。所以产生的异常被缓存到服务器。如何使用“除非”来防止这种情况?我可以在里面配置异常吗?

以上是关于在缓存中找不到但不缓存结果时如何使@Cacheable返回null?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Terraform 使 AWS CloudFront Distribution 缓存失效?

我得到 - 错误:在缓存中找不到条目 - 在 sls 部署期间

在我们的缓存中找不到任何与“最新”匹配的“cra-template-typescript”版本

Lua with nginx in openresty:如果在 redis 缓存中找不到数据,则将请求传递给 FastCGI

循环依赖的底层原理

springboot-redis缓存