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