memcache.Client在GAE Python中未设置缓存值
我正在尝试在我的网络应用程序中添加内存缓存(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
,这就意味着我每次都要去数据库发出一个没用的请求。
我已经仔细阅读了相关文档:
- https://developers.google.com/appengine/docs/python/memcache/
- https://developers.google.com/appengine/docs/python/memcache/clientclass
- http://neopythonic.blogspot.pt/2011/08/compare-and-set-in-memcache.html
看起来我做的都没错。那我到底漏掉了什么呢?
(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 的非线程安全版本的代码 ...