memcache.Client没有在GAE python上设置缓存值

时间:2014-05-08 15:22:34

标签: python google-app-engine caching memcached

我正在尝试将memcache添加到我在GAE上部署的webapp,为此我使用memcache.Client()来防止任何竞赛条件造成的损害:

from google.appengine.api import memcache

client = memcache.Client()
class BlogFront(BlogHandler):
    def get(self):       
        global client 
        val = client.gets(FRONT_PAGE_KEY)
        posts = list()

        if val is not None:
            posts = list(val)
        else:
            posts = db.GqlQuery("select * from Post order by created desc limit 10")
            client.cas(FRONT_PAGE_KEY, list(posts))

        self.render('front.html', posts = posts)

为了测试问题,我有一个显示最近10个条目的博客的首页。如果缓存中没有任何内容,我会通过请求命中数据库,否则我只是将缓存的结果呈现给用户。

问题在于,无论我做什么,我总是得到val == None,这意味着我总是用无用的请求命中数据库。

我对文档进行了筛选:

看来我正在做的一切正确。我错过了什么?

(PS:我是一个python newb,如果这是一个迟钝的错误,请耐心等待我xD)

2 个答案:

答案 0 :(得分:1)

来自google.appengine.api import memcache

class BlogFront(BlogHandler):
    def get(self):       
        client = memcache.Client() 
        client.gets(FRONT_PAGE_KEY)
        client.cas(FRONT_PAGE_KEY, 'my content')

由于我无法理解的原因,解决方案是在gets来电之前拥有cas权利......

我想我现在会坚持使用memcache非线程安全版本的代码......

答案 1 :(得分:0)

我怀疑client.cas调用失败,因为没有对象。也许client.cas只能用于更新现有对象(如果当前没有对象,则不设置新对象)?你可以试试client.add()(如果一个对象已经存在了指定的密钥会失败,我想你想要的是什么?)而不是client.cas()