我正在尝试将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)
答案 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()