memcache.Client在GAE Python中未设置缓存值

1 投票
2 回答
587 浏览
提问于 2025-04-18 05:51

我正在尝试在我的网络应用程序中添加内存缓存(memcache),这个应用程序是部署在Google App Engine(GAE)上的。为此,我使用了 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新手,如果这是个很傻的错误,请多多包涵 xD )

2 个回答

0

我猜测client.cas这个调用失败是因为没有对象。也许client.cas只适用于更新已经存在的对象(而不是在没有对象的情况下创建一个新对象)?你可以试试client.add()这个方法(如果指定的键已经有对象存在的话,这个方法会失败,我觉得这正是你想要的?)来代替client.cas()

1

从 google.appengine.api 导入 memcache

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

我现在还不太明白为什么,但解决办法是在调用 cas 之前先调用一次 gets ...

我想我暂时还是会使用 memcache 的非线程安全版本的代码 ...

撰写回答