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

如果可选缓存为空,Spring4.3如何从缓存中展开它

申高卓
2023-03-14

我的团队一直在Spring中使用@Cacable注释,缓存是可选的

我试着在文档中查找,但我找不到任何地方可以解释Spring在进入缓存时的行为,找到空并且应该返回可选

共有3个答案

孙宏壮
2023-03-14

在版本4.3左右的Spring缓存抽象中添加了对可选缓存的支持。3.RELEASE有关示例,请参见本文的条件缓存部分。

缓存抽象支持java。util。可选,仅当存在时才将其内容用作缓存值#结果始终引用业务实体,而从不在受支持的包装上,因此前面的示例可以重写如下:

@Cacheable(cacheNames="book", condition="#name.length < 32", unless="#result.hardback")
public Optional<Book> findBook(String name)

请注意,结果仍然是指Book,而不是可选的。

也可以看到这个SO帖子。

轩辕远
2023-03-14

我知道有点晚了。我发现这个问题在寻找同样的问题。

我不是以英语为母语的人,对“除非”的含义感到困惑。最后,我用相反的方法解决了这个问题@Anand建议:

除非="#结果==null"

像这样:

@Cacheable(value = "clients", key = "#p0.concat(#p1)", unless = "#result == null")
Optional<Client> findByClientAndProfile(String idClient, String profile);
应向晨
2023-03-14

我对此进行了测试,Spring将把空值放入可选值中。

 类似资料:
  • 我正在使用注释来缓存我的方法的结果。出于性能原因,我想缓存从方法返回的和非null值。 但是这里的问题是Spring缓存非空值,但由于某种原因没有缓存空值。 这是我的密码: 我什么都试过了。就连我 但这也没什么帮助。有关于这个的指示吗?

  • 我已经在一台主机上安装了一个带有NGINX的Ubuntu实例,并将其配置为另一台主机上我的应用程序的转发代理。我的应用程序正在向NGINX发出GET请求,NGINX正在向外部服务器发出另一个GET请求(请求中指定了指向此服务器的URL),并将响应返回给应用程序。NGINX应该缓存来自外部服务器的响应。我需要尊重响应中的缓存控制头(缓存该头所说的响应),但是!当响应中没有缓存控制头时,必须缓存12小

  • 我正在使用Guava缓存热数据。当缓存中不存在数据时,我必须从数据库中获取数据: 我的问题是当数据不存在于数据库中时,我希望它返回并且不做任何缓存。但Guava保存与缓存中的关键字,并抛出一个异常,当我得到它: com.google.common.cache.CacheLoader$InvalidCacheLoadExcION: CacheLoader为shisoft键返回null。 我们如何避免

  • 我创建了一个用户存储SPI,用于对外部数据库中的用户进行身份验证,我可以在keydeport的“用户”页面列出所有用户,用户可以从keydeport登录页面登录http://127.0.0.1:8080/auth/realms/dev/account/.但如果我想从http://127.0.0.1:8080/auth/realms/dev/protocol/openid-connect/token

  • 扩展说明 用请求参数作为 key,缓存返回结果。 扩展接口 org.apache.dubbo.cache.CacheFactory 扩展配置 <dubbo:service cache="lru" /> <!-- 方法级缓存 --> <dubbo:service><dubbo:method cache="lru" /></dubbo:service> <!-- 缺省值设置,当<dubbo:serv

  • 我有一个每10分钟运行一次的cron作业,并更新内容类型和x-amz-meta。但从昨天开始,似乎在cron作业运行之后,亚马逊并没有恢复所做的更改(刷新他的缓存)。 我甚至手动进行了更改,但没有更改... 上载视频时,它有一个应用程序/x-mp4内容类型,cron作业将其更改为视频/mp4。 虽然S3的内容类型正确,但cloudfront显示的是应用程序/x-mp4(旧的内容类型)。。。。 cr