【问题标题】:AttributeError when using memcache.gets()使用 memcache.gets() 时出现 AttributeError
【发布时间】:2015-01-05 16:03:36
【问题描述】:

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

导入库

from google.appengine.api import memcache

然后使用

调用它

posts = memcache.gets("posts")

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

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

【问题讨论】:

    标签: python google-app-engine memcached


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      如果你真的确实需要比较和设置,可以找到很好的解释here:

      Client 对象是必需的,因为gets() 操作实际上 隐藏一些隐藏的信息,供后续使用 cas() 操作。因为 memcache 函数是无状态的(意味着 它们不会改变任何全局值),这些操作只是 可作为 Client 对象上的方法使用,而不是作为 内存缓存模块。 (除了这两个,Client上的方法 对象与模块中的函数完全相同,您可以 通过比较文档来判断。)

      解决方案是使用类:

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

      当然,要使 cas 有用,您还需要更多。

      【讨论】:

        猜你喜欢
        • 2019-03-24
        • 1970-01-01
        • 1970-01-01
        • 2013-10-31
        • 2017-04-26
        • 1970-01-01
        • 1970-01-01
        • 2022-10-05
        • 2017-06-16
        相关资源
        最近更新 更多