当前位置: 首页 > 知识库问答 >
问题:

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

秋博容
2023-03-14
@Cacheable(value="books", key="#isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
    null
  • 根据密钥在缓存中查找
  • 如果找到,则从缓存返回结果
  • 如果未找到,则返回NULL

我不想在cache-miss的情况下更新缓存,有没有办法使用spring注释来做到这一点

共有1个答案

沈子实
2023-03-14

这是我最后得出的结论,诀窍是使用“除非”对我们有利

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

此方法

  • 根据密钥在缓存中查找
  • 如果找到,则从缓存返回结果
  • 如果未找到,则计算返回NULL的方法
  • 返回值与除非条件匹配(该条件始终返回true)
  • 不缓存空值
  • 空值返回给调用方
 类似资料:
  • 我很清楚关于这个话题有多个问题,但我就是弄不懂它的意思。问题似乎是没有将新值添加到@cacheable列表中。 调试完问题后,我发现问题似乎出在钥匙上。 下面是代码片段 所以当我调用save方法时,用于缓存的关键字是incrementing integer,或者1,2,3...但是当我尝试获取所有文档时,缓存使用SimpleKey[]作为键。如果我尝试为@Cacheable使用相同的键,我会得到S

  • 我正在研究Spring3.1注释缓存,ehcache作为缓存实现。 一个返回值像这样的方法 我第一次得到了一个myject返回值,它是可编辑的。ehache可以通过设置“拷贝读取”或“拷贝写入”来做些什么。它将强制序列化读/写对象。但是在第一次Spring不会从缓存中获取值,它总是返回通过方法本身。 是否有某种方法可以获取只读返回值?

  • 我有一个简单的用例,服务器为请求返回Etag,并将该Etag作为标头(即)添加到所有后续url请求。如果响应中有变化,服务器可以用响应,否则可以用响应。对于后者,重用缓存中的响应是有意义的。但是okhttp总是返回作为缓存响应。 我做了一些故障排除,okhttp在内部将响应写入磁盘,但是不会将其返回到。仔细研究类,有一些文档明确说明不会使用缓存: 编辑-更正,Okhttp正确地添加了etag标头。

  • 我在java Play Framework作业中使用Caffeine cache实现来缓存传出的http请求,我看到,尽管缓存已经启动并运行,但我的服务仍然每次都访问外部服务器,而不是返回缓存中的值。我看到记录在日志中的键总是相同的。 所以我看到没有设置,所以这可能意味着缓存立即过期。但我仍然不知道如何在配置中设置它 我没有更改我的java代码,如果我需要这样做,我找不到任何示例,或者我只应该有一

  • 目前,我正在使用Spring缓存和/注释。 我想得到某种控制台日志语句,如