GAE上的奇怪内存缓存行为

时间:2013-05-15 15:02:03

标签: google-app-engine memcached

我正在使用memcache创建一个简单的CRUD系统,以便更快地读取表格,但我对这种行为感到有些困惑。

基本上,这是重要的代码:

class Book(db.Model):
    title = db.StringProperty(required=True)


@classmethod
def getAll(cls):
    key = 'booklist'
    books = memcache.get(key)
    if books is None:
        logging.info('DB access for key %s.', key)
        books = Book.all().order("title").fetch(100)
        if not memcache.set(key, books, 300):
            logging.error('Memcache set failed for key %s.', key)
    else:
        logging.info('Memcache for key %s.', key)
    return books


# Save a Book and return it
@classmethod
def save(cls, title):
    book = Book(title=title)
    book.put()
    # Flush memcache for this key
    if memcache.delete('booklist') != 2:
        logging.error('Memcache delete failed')
    return book

在应用程序代码中我可以添加一本书,所以,一旦我从表单中获得标题,我就会这样做:

    book = Book.save(title)
    if book is None:
        logging.error('Book save error.')

    self.redirect("/showBooks")

最后一次重定向让我看到了这段代码:

    def get(self):
        books = Book.getAll()
        self.renderPage("listBooks.htm", data=books)

只能获得所有书籍并将其显示在桌面上。问题是这些步骤执行得如此之快,或类似的事情,因为保存功能刷新缓存(它出现在日志中),getAll函数写入日志'数据库访问密钥列表',但没有出现在表,就像GAE仍在保存数据存储区中的数据并且新元素没有时间被加入。 而且,如果你只是等待15秒并刷新页面,那么数据就在那里。

我尝试了其他的事情:我没有保存,而是通过重定向立即刷新页面,我创建了一个“中间信息页面”,其中包含“已成功保存”的消息。如果我从这个中间页面进入列表页面,而不接触任何其他代码,一切正常(新数据出现在表格中,就像预期的那样)。再一次,这让我觉得GAE需要时间来保存对象,我原来做的直接阅读速度更快。

显然,如果我手动刷新内存缓存,请在下一页刷新所有新数据。

这可能是真的吗?我的阅读比GAE写得快,这是我遇到的问题吗?

0 个答案:

没有答案