使用memcache.gets()时的AttributeError

时间:2015-01-05 16:03:36

标签: python google-app-engine memcached

我正在尝试将memcached与Google App Engine一起使用。我使用

导入库

from google.appengine.api import memcache

然后使用

调用它

posts = memcache.gets("posts")

然后我收到以下错误: AttributeError: 'module' object has no attribute 'gets'

我查看了有关内存缓存的Google App Engine文档,但我找不到使用memcache.gets()的任何示例。 Memcache.get()似乎以我调用上面的方式使用。

2 个答案:

答案 0 :(得分:2)

getsmemcache客户端对象的方法,不是 memcache的模块级函数。模块级功能非常简单,无状态和同步;使用客户端对象,如果必须,可以执行更高级的操作,如https://cloud.google.com/appengine/docs/python/memcache/clientclass中所述。

具体而言,根据https://cloud.google.com/appengine/docs/python/memcache/clientclass#Client_gets的文档,"您使用" gets"而不是get,如果您想要避免两个或多个呼叫者同时尝试修改相同键值的情况,从而导致意外的覆盖。"由于gets也会获得(并在客户端对象中存储)cas_id,因此您可以使用cas(比较和设置)调用(您不必明确)自己处理cas_id

由于您似乎没有尝试比较和设置操作,我建议使用更简单的模块级函数get,而不是实例化客户端对象并使用它实例方法gets

答案 1 :(得分:0)

如果你实际需要比较和设置,可以找到一个非常好的解释here

  

Client对象是必需的,因为实际上是gets()操作   松开一些随后使用的隐藏信息   cas()操作。因为memcache函数是无状态的(意思是   他们不会改变任何全球价值观,这些操作只是   作为Client对象的方法,而不是作为函数   内存缓存模块。 (除了这两个,客户端上的方法   object尽可能与模块中的函数完全相同   通过比较文档告诉。)

解决方案是使用类:

client = memcache.Client()
posts = client.gets("posts")
...
client.cas("posts", "new_value")

虽然,当然,你需要的不仅仅是cas有用。