Caching 将结果存储到Play 2.2中的缓存中

Caching 将结果存储到Play 2.2中的缓存中,caching,playframework-2.0,ehcache,Caching,Playframework 2.0,Ehcache,In-Play framework 2.2非常容易创建当前请求的结果。我们只需键入: Ok(views.html.default.render()) 然后,通过操作将其包装起来就足以使其工作,因此最终代码如下所示: def index = Action { Ok(views.html.default.render()) } 那很好。但是现在,我想将响应存储在缓存中,以使其更具可伸缩性。我使用EHCache。问题是,当我将它存储到缓存中时,它会抛出 NotSerializableExcep

In-Play framework 2.2非常容易创建当前请求的结果。我们只需键入:

Ok(views.html.default.render())
然后,通过操作将其包装起来就足以使其工作,因此最终代码如下所示:

def index = Action {
  Ok(views.html.default.render())
}
那很好。但是现在,我想将响应存储在缓存中,以使其更具可伸缩性。我使用EHCache。问题是,当我将它存储到缓存中时,它会抛出

NotSerializableException: play.api.mvc.ActionBuilder$$anon$1
ERROR net.sf.ehcache.store.disk.DiskStorageFactory Disk Write of result-key failed: 
java.io.NotSerializableException: play.api.libs.iteratee.Enumerator$$anon$18
我试图缓存至少它自己的结果,但它抛出

NotSerializableException: play.api.mvc.ActionBuilder$$anon$1
ERROR net.sf.ehcache.store.disk.DiskStorageFactory Disk Write of result-key failed: 
java.io.NotSerializableException: play.api.libs.iteratee.Enumerator$$anon$18
我知道,这些值存储在缓存中,但仅存储在内存中,考虑到实际的高负载和许多不同的响应,这可能是非常不够的

问题: 所以我的问题是,是否有任何方法可以完全缓存播放操作/结果,包括正确的序列化

编辑: 如何使用缓存:我不使用
Cached{}
,因为它的行为与我所需要的不完全一样,所以我尝试以我自己的方式设计它。因此,仅出于测试目的,我现在更详细地使用它:

Cache.set("myaction", Action {
  Ok(views.html.default.render())
})

但这两种情况都会产生上述例外情况


关于缓存:Play cache API对我来说是不够的,所以我用另外两种方法和新的插件实现对它进行了扩展。起初我试图复制默认插件并实现这些扩展,但有一些问题,所以我建议修复它们。这是插件修复。从那时起,它似乎实际使用了EHCache(从这些异常中猜测)。

我觉得您并没有试图将结果存储在缓存中,而是将操作存储在缓存中,该操作包含一个无法序列化的闭包,我想这不是您想做的,我想这是因为您直接使用了EHCache

如果您使用Play cache API,它将帮助您做正确的事情。您可以在此处找到它的文档:

但是,响应可能仍然不可序列化,如果您确实希望缓存序列化到磁盘,那么应该能够缓存模板生成的HTML,因为它基本上是一个字符串,然后重新使用它,但为每个请求创建一个新的响应


(我的直觉是,每次呈现模板可能比缓存从磁盘读取模板获得更好的性能,除非你有一些非常复杂的模板)

不确定它是否适合2.2,但是根据我的报告


如果您直接从CacheApi实现调用
set
方法,而该实现需要一个可序列化的对象,请使用该对象,
@cached
帮助程序也会使用该对象。

如何将结果存储到缓存?@mantithetical查看我的编辑,请单击以获取答复。我试着把结果和行动都储存起来——我有疑问地说了,关于行动,你可能是对的。我不确定直接使用缓存是什么意思,但我对默认实现做了一些改进。请查看我的问题编辑。你说过缓存操作不是个好主意。缓存自己的结果呢?就像我在编辑中展示的那样。无论如何,我想知道播放缓存是如何工作的,因为缓存响应在那里是受支持的。。。它只是一些没有序列化到FS的memcache吗?它从不序列化,只是将对象保存在内存中。您可以在play.jar/ehcache.xml和play发行版附带的play sources中找到默认的play cache配置,您还可以仔细查看缓存实现,了解它是如何工作的。因此,如果我还想缓存操作以快速响应,您建议我使用两个缓存?一个是针对公共数据的序列化,另一个是针对结果的序列化?我认为您应该查看缓存类的实现,以了解它是如何工作的,然后基于这种理解实现自定义的。此外,请确保基准/配置文件,可能只是缓存您的回复所需的数据就是您所需的,而操作逻辑是无关紧要的!即使对于2.4.x来说,这也是一个启发性的问题和答案。我在使用redis作为缓存模块时遇到了(几乎)相同的问题。现在我真的对play的文档有问题了。