0

我正在使用 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 函数会在日志中写入“DB access for key booklist”,但没有出现在表,就像 GAE 仍在数据存储中保存数据并且新元素没有时间读取一样。而且,如果您只需等待 15 秒并刷新页面,那么数据就在那里。

我尝试了其他事情:我没有使用重定向保存并立即刷新页面,而是创建了一个带有“成功保存”消息的“中间信息页面”。如果我从这个中间页面转到列表页面,而不触及任何其他代码,一切正常(新数据出现在表中,就像预期的那样)。同样,这让我认为 GAE 需要时间来保存对象,而我最初正在执行的立即读取速度更快。

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

这是真的吗?我的读取速度比 GAE 写入速度快,这是我遇到的问题吗?

4

0 回答 0