【发布时间】:2017-08-13 01:00:03
【问题描述】:
另一个关于缓存的 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;
}
}
问题是,我总是从缓存中获取相同的对象。对于同一个对象,我实际上是指内存中的同一个对象。我猜它存储在内存中的某个哈希图中,我每次都获取相同的条目。
这意味着,当我浏览两个网站时,当前和上一个菜单项会突出显示。显然,如果我浏览更多网站,情况会变得更糟。
我期望(和需要)的是菜单项列表的副本。如果我用 Redis 替换 EhCache,我总是会得到副本(这是有道理的,因为 redis 服务器是另一台机器)。
那么,我如何告诉 Play 只获取缓存对象的副本。我真的不想手动复制所有这些对象。如果 Play 没有内置解决方案,那么通用方法是什么? 显然,缓存中的所有对象都是可序列化的,所以我想可以很容易地复制这些对象。
谢谢你, 舒贝
【问题讨论】:
标签: java caching playframework-2.0 ehcache