gpt4 book ai didi

java - PlayFramework 中缓存中的对象似乎是原始对象?

转载 作者:行者123 更新时间:2023-12-02 02:57:01 24 4
gpt4 key购买 nike

另一个与缓存相关的 PlayFramework 2.x(具体为 2.5)相关问题。 Play 使用 EhCache,但我认为这是一个 Play 问题,而不是 EhCache 问题 - 但我可能是错的。

所以我从缓存中获取对象。在此示例中,我从数据库获取菜单项,然后突出显示当前菜单项。这是代码:

List<Menu> menuitems = cache.getOrElse("menu", () -> getMenuitemsFromDatabase(), DURATION_14_DAYS);
for (Menu menuitem : menuitems) {
if (menuitem.getUrl().equals(request.uri())) {
menuitem.setHighlighted(true);
break;
}
}

问题是,我总是从缓存中获取相同的对象。对于同一个对象,我实际上指的是内存中的同一个对象。我猜它存储在内存中的某个 HashMap 中,并且我每次都获取相同的条目。

这意味着,当我浏览两个网站时,当前和上一个菜单项会突出显示。显然,如果我浏览更多网站,情况会变得更糟。

我期望(和需要)的是菜单项列表的副本。如果我用 Redis 替换 EhCache,我总是会得到副本(这是有道理的,因为 Redis 服务器是另一台机器)。

那么,我如何告诉 Play 仅获取缓存对象的副本。我真的不想手动复制所有这些对象。如果 Play 没有内置解决方案,通用方法是什么?显然,缓存中的所有对象都是可序列化的,因此我猜想可以轻松复制这些对象。

谢谢你,舒贝

最佳答案

不确定这里使用的是哪个版本的 ehcache,因此解决此问题的方法可能会有所不同...但如果不需要,Ehcache 确实不会复制对象。仅当还需要序列化时才需要它(例如您的 redis 用例)。但只要该条目保留在 JVM 堆上,您实际上就会得到相同的对象。

如何最好地解决这个问题?好吧,这取决于:您可以在 ehcache 的缓存级别强制执行“读/写复制”语义( 2.x/3.x );但如果我是你,我会考虑其他解决方案......因此,你会为缓存访问引入不必要的延迟......但我不太确定在这个非常具体的用例中你最好如何解决

无论如何,模仿redis(在虚拟机之外)读/写复制语义可能是最简单的,但性能也可能较差。

关于java - PlayFramework 中缓存中的对象似乎是原始对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42925803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com