我正在使用 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 写入速度快,这是我遇到的问题吗?