【问题标题】:How to cache things for my servlet?如何为我的 servlet 缓存内容?
【发布时间】:2012-06-22 22:03:01
【问题描述】:

我正在使用 Spring 3.1 开发在 Google App Engine 上运行的 Web 服务 servlet,由于我对这个游戏还很陌生,我根本不知道应该如何缓存内容。在 servlet 的生命周期内,我似乎可以在很多地方放置需要维护的东西:

  1. 应用程序上下文。在这里定义 bean 可以让我轻松地将它们注入到我的代码中。这似乎是最简单的解决方案,只需将我的 bean 限定为单例。
  2. Servlet 上下文。为此,当我的 servlet 启动时,我可以通过抓取它的实例并将其放入 ServletContext 中,然后执行 setAttribute()
  3. 内存缓存。我还没有研究这么多,但我想我会得到一个缓存实例,然后像 ServletContext 一样将一个对象推入其中。

我很好奇的具体案例是创建用户帐户。我想保留所有用户 ID 的 HashSet,以便检查请求的用户 ID 是否已在使用中。

除了上面的具体案例,包括使用每种不同技术的案例,我们将不胜感激。

【问题讨论】:

  • 请注意,1 和 2 实际上是相同的。在一般的基于 servlet 的 MVC 框架中,“应用程序上下文”使用了 servlet 上下文属性。它只是一个额外的抽象层。
  • 我认为将所有用户 ID 存储在 HashMap 缓存中并不是一个好主意。首先,这不会水平扩展。其次,您需要同步读取/写入它以确保不存在竞争条件。

标签: java spring google-app-engine caching servlets


【解决方案1】:

在您的具体情况下,我建议您使用持久存储,例如数据存储或云 sql(您可以查看所有替代方案 here)。

Memcache 不是一个选项,因为您无法控制存储多少元素。而且任何应用程序上下文也不是解决方案,因为实例实际上在不同的数据中心被多次加载和重新加载。

另请注意,AppEngine 支持通过 Users Service 使用 Google 帐户或 OpenId。

【讨论】:

  • 好点。需要明确的是,每次我需要检查是否使用了用户 ID 时,我都会访问数据存储区?你能举例说明我什么时候会使用 memcache/application context/servlet context
  • 是的,您每次都会访问数据存储区,但您可以索引该属性。通常,您使用 memcache 来缓存缓慢/昂贵的查询/进程,例如检索给定用户的整个配置文件(这可能涉及计算使用统计信息等)。常见的模式是:如果 memcache 中的 element(query/process/etc) 返回它;否则计算,保存并返回;而且您还需要注意,每当您更改可能影响先前结果的资源时,您都需要使缓存中的该条目无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 2012-12-13
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
相关资源
最近更新 更多