在Play!中,play.api.Cache
是一个单例对象,因此可以从所有其他对象全局访问。而且,就其本质而言,缓存是一个可变对象。像这样的全球可变状态通常很成问题。
特别是,存在钥匙碰撞的潜在问题。两个不同的类(否则彼此松散耦合)可能会偶然使用相同的键来存储某些值。然后,其中一个更新将被另一个更新。
这个问题的一个可能的解决方案是创建一个新类,它甚至可以委托给全局Cache
,但是为密钥添加某种“命名空间”。尽管这并不难实现,但如果已经有一些标准的解决方案来解决这个问题会更好(最好在Play!本身上实现)。有没有?
答案 0 :(得分:1)
最简单的方法是为您的密钥设置一个标识符。例如,给定User
类,在将其保存到缓存时使用"user"+user.id
作为键。这样你就不用担心冲突了。
请注意,我正在考虑单个Play应用程序使用的缓存。默认情况下,EhCache使用Play正在使用的相同JVM空间,因此不能有2个不同的User
类。如果您正在使用多个应用程序共享缓存的外部缓存,那么您应该为其键添加一些命名空间(appName.class.classId
或类似)。但这不应该是独立播放应用程序中的问题。
关于如何清空缓存的评论,通常你不应该担心它。从理论上讲,长期的陈旧密钥将在不使用时从缓存中删除。有关如何/何时根据缓存实现(LRU等)进行更改的详细信息,除非您有一个非常具体的约束,否则应该不是问题。