class MainHandler(BaseHandler.Handler):
def get(self):
user = users.get_current_user() or "unknown"
posts = memcache.get('posts_%s' % user.user_id())
if not posts:
q = db.Query(P.Post)
q.filter('author =', users.get_current_user()).order("-date")
posts=q.fetch(5)
memcache.set(key='posts_%s:'%user.user_id(),value=posts)
#q=P.Post.all().filter('user =',users.get_current_user())
self.render('index.html', user=user, posts=posts)
def post(self):
user = users.get_current_user() or "unknown"
author = users.get_current_user()
title = self.request.get('title')
content = self.request.get('content')
p = P.Post(author=author, title=title, content=content)
p.put()
res = memcache.get('posts_%s'%users.get_current_user().user_id())
if res:
res+=p
if len(res)>5:
res=res[1:]
else:
res=[p]
memcache.replace("posts_%s"%user.user_id(),value=res)
self.redirect('/')
当浏览器重定向到'/'时,最后添加的项目不在列表中(仅在重新加载后才添加)。这只发生在我在开发服务器上时(在GAE上工作正常),我想知道它是否会在GAE上发生,这个代码有什么问题
任何建议都将受到高度赞赏。
UPD:thx,我的密钥相同,但问题仍然存在
答案 0 :(得分:2)
你根本没有打到memcache。您在post
和get
方法中使用了不同的密钥格式:在get
中使用" posts_user"而在post
中,您使用" user:posts",因此永远找不到密钥,您将进入db查询。当然,由于最终的一致性,查询不是最新的,这可能是您首先使用memcache的全部原因。
修复你的memcache密钥,这应该可行。
答案 1 :(得分:1)
当您替换时,该项目可能不在内存缓存中。为什么在这种情况下使用替换?有什么理由不使用memcache.set?在get函数中,仍然有一个键是posts_%s的地方:与其他地方不同。