2

在 Play!中,play.api.Cache是一个单例对象,因此可以从所有其他对象全局访问。而且,就其本质而言,缓存是一个可变对象。像这样的全局可变状态通常是非常有问题的。

特别是存在密钥冲突的潜在问题。两个不同的类(否则它们彼此松散耦合)可能会意外地使用相同的键来存储一些值。然后,其中一个更新将被另一个覆盖。

这个问题的一种可能的解决方案是创建一个新类,它甚至可以委托给 global Cache,但在键中添加某种“命名空间”。尽管这并不难实现,但如果已经有一些标准的解决方案来解决这个问题会更好(最好在 Play! 本身上实现)。有没有?

4

1 回答 1

1

最简单的方法是将标识符放入您的密钥。例如,给定一个User类,"user"+user.id在将其保存到缓存时用作键。这样你就不用担心冲突了。

请注意,我正在考虑单个 Play 应用程序使用的缓存。默认情况下,EhCache 使用 Play 使用的相同 JVM 空间,因此其中不能有 2 个不同User的类。如果您正在使用多个应用程序共享缓存的外部缓存,那么您应该为它们的键(appName.class.classId或类似的)添加一些命名空间。但这在独立的 Play 应用程序中应该不是问题。

关于讨论如何清空缓存的评论,通常您不必担心。理论上,长期的、陈旧的密钥会因为没有被使用而从缓存中删除。关于如何/何时根据缓存实现(LRU 等)更改的详细信息,但除非您有非常具体的约束,否则应该不是问题。

于 2012-11-01T09:20:59.907 回答