2011-10-22 80 views
1

我正在使用GAE memcache在每个请求上获取布尔值。这个布尔值是启用/禁用特定url的标志。在每个导致问题的请求上获取memcache变量

如果它是真的,一切正常,如果它是假的,它会发回一个特定的格式响应。

该服务每秒处理约7个请求,问题在于Google似乎已经引入了访问内存缓存的限制,而且现在这个提取在几天前每秒约1次请求时一直失败,所以此过程具有变得完全不可靠。我不得不做一个紧急补丁从代码中删除此检查。但我需要一个替代例程来启用/禁用该服务。

使用servlet实例变量是一个选项,但每个jvm实例都有自己的特性,因此无法工作。

任何人都可以提出一个这样做的方法吗?

+0

这听起来不太好!最简单的要求是什么,仍然存在问题?如果您的整个请求只包含获取该memcache值的内容。问题是否仍然存在?你正在使用什么运行时,你的memcache调用是什么样的? –

+0

在发生这种情况时/之后,管理控制台中是否存在有关您的应用的任何警告? –

回答

1

对访问内存缓存的频率没有限制(健全性检查除外)。不过,无论如何,你不应该完全依靠memcache来存储一个值;您应该始终有一个回退到永久存储机制(如数据存储)。

0

为保持一致性,使用数据存储区/事务而不是memcache可能更好。

为了减少数据存储/事务的延迟,您可以尝试混合使用memcache和数据存储/事务方法。例如

# while reading status 
# 1. try to read from memcache 
# 2. if memcache exists, return the value 
# 3. if not, read from datastore, save to memcache, and return 

# while writing status 
# 1. use a transaction to write data to datastore and memcache 
+0

这已经是它的工作原理了。正如您所述,布尔memcache值由数据存储备份(如果它不存在)。 这不是因为该值不在memcache中返回null,而是实际上无法从memcache中获取它并引发异常。这一直工作得很好,直到大约2天前从未发生过。 如果我重新获取发生的那个memcache异常,它将会过于昂贵,因为它经常发生。 –