【问题标题】:Play 2.5+ and CacheAPI播放 2.5+ 和 CacheAPI
【发布时间】:2016-08-10 00:09:39
【问题描述】:

我正在使用 Play 2.5.4。我刚开始使用 CacheAPI 来存储当前登录的用户,因为它在页面请求中需要多次。我通过 cache.set() 将此对象添加到缓存中。我有这个工作得很好。

问题是,如果我将此用户对象更新为具有与管理员帐户不同的权限或角色,我需要使该用户的缓存对象无效,以便用户可以获得正确的权限或角色。

如何为用户更新缓存? 如何跨多个 Web 服务器做到这一点?

感谢您的帮助!

【问题讨论】:

  • 如何缓存用户?这个缓存的键是什么?..
  • 我在 Play 中通过 cache.set() 和 cache.get() 进行缓存,它在后台使用 EHCache。当用户登录时,我将用户的 ID(主键)存储在会话中,然后使用该用户的 ID 通过缓存键从缓存中检索该用户对象。

标签: playframework


【解决方案1】:

如何为用户更新缓存?

您只需再次添加它。假设您使用用户 ID 作为键

cache.set(user.getId(), user);

如何跨多个 Web 服务器执行此操作?

现在这是一个完全不同的问题。 Play默认使用EhCache作为缓存提供者,Play Cache api默认不创建分布式缓存。

我对EhCache了解不多,但我认为它支持不同产品中的分布式缓存(即多台服务器之间的缓存),并且还支持复制。所以你可能想先调查一下,看看它是否适合你。

您还可以创建 Cache API 的实现,并使用 EhCache/Terracota/Memcached/HazelCast 来提供您需要的设置。

另一个选项是让您使用 Akka Clustering/PubSub 扩展之类的东西并处理缓存失效(即:使服务器 1 中的缓存失效 --> 为每个服务器广播消息以使该缓存也失效)。除非您对 Akka 和 PubSub 扩展感到满意,否则这可能很难实现。

作为最后的手段,如果您负担得起,您可以将缓存设置为较短的过期时间(例如:1 分钟)。这是最简单的方法,前提是您的应用程序最多只能看到过期对象的过期时间

【讨论】:

  • 感谢您的回复。我有我的单服务器缓存实例,使用会话来保存用户的密钥,并缓存通过会话中的密钥检索用户对象。 session.put("USER_ID", user.id)... 然后从 cache.get("CACHED_USER" + sessiong.get("USER_ID"))... 中检索类似的东西,但我检查空值,等等 由于 Play 使用 EHCache,我将检查 EHCache 的集群实现。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多