2014-03-29 2 views
0
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 и в чем проблема с этим кодом.Memcached не обновляется по времени

Любые предложения будут высоко оценены.

UPD: ТНХ, я сделал то же ключи, но проблема по-прежнему остается

ответ

2

Вы не попав в кэш памяти все здесь. Вы используете другой формат ключа в методах post и get: в get вы используете «posts_user», тогда как в post вы используете «user: posts», поэтому ключ никогда не будет найден, и вы попадете в запрос db. И, конечно, запрос не обновляется из-за возможной последовательности, которая, по-видимому, является основной причиной, по которой вы используете memcache в первую очередь.

Исправьте ключи memcache, и это должно сработать.

+0

Я установил ключи, но мне все равно нужно перезагрузить страницу, чтобы увидеть новую запись. Есть ли вероятность, что memcache обновляется слишком долго, чтобы увидеть новую запись после первого перенаправления? –

+0

Ключи в обновленном коде все еще разные. – Greg

1

Возможно, элемент не находится в memcache при замене. Почему вы в этом случае используете замену? Любая причина не использовать memcache.set? В функции get есть еще одно место, где ключ - posts_% s: он отличается от остальных.

Смежные вопросы