2012-01-25 24 views
1

我正在开发部署在Google应用引擎上的基于Spring的Web应用程序。 我有一个经理,在应用范围内存储数据。我使用的是一个弹簧bean(singleton),它拥有一张地图,并简单地执行get和remove从地图,然而GAE是一个分布式环境,这种设计有一个问题,因为每个应用程序实例将有自己的经理和请求不是保证对相同的应用程序实例进行。 所以我环顾四周,发现2可能的解决方案:Google应用引擎和应用范围数据

  1. 使用数据存储
  2. 使用的memcache

存储数据会造成大量的读取和写入,并最终我不需要要保存的数据。 第二看起来前途无量,但谷歌提到:

一般情况下,一个应用程序不应指望缓存值始终可用。

我需要一个保证,当我让我的管理员获得一个值时,它会返回它。

有没有其他解决方案? 我错过了什么?

+0

这是什么类型的数据?它有多少?它多久更换一次? –

+0

这是一个多玩家游戏地图,每个元素都是一个可以保持该游戏中所有玩家状态的游戏(最多5个玩家)。数据每秒钟都会频繁地读取,并且每隔5秒左右更新一次。在大小方面它不是很大,在最大它将小于1MB –

回答

2

一个常见的解决方案是将值存储在由数据存储支持的memcache中。

首先从memcache中获取应用程序范围值,如果memcache返回零结果(cache-miss事件),则从数据存储中获取值并将获取的值放在memcache上。

通过这种方式,memcache的下一次获取将返回您的应用程序范围数据,从而减少了对数据存储的相对昂贵读取的需求。

App Engine memcache是​​最近使用最少的高速缓存,因此经常读取的值会因少数高速缓存未命中事件而受到影响。

具有应用程序范围值的更复杂解决方案是将驻留内存中的值存储在驻留的后端,并让所有其他实例通过servlet处理程序向/从该特定后端请求/更新值。

+0

好吧,我只是这样做。使用dao图层的memcache infront。 –

+0

如果有帮助,你能接受答案吗?如果您想接受答案,请点击答案左侧的虚线复选标记。它会变成一个绿色的复选标记。 –