我正在尝试将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()似乎以我调用上面的方式使用。
答案 0 :(得分:2)
gets
是memcache
客户端对象的方法,不是 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有用。