我现在被屏蔽了。
问题是这样的:我有一个存储在内存缓存中的书籍列表的“视图”。如果我添加一本新书,我想将新书添加到存储书籍列表的 memcache 变量中。更新和删除也是如此。
您可以说:“您可以刷新密钥并再次收集所有数据”。但是由于最终的一致性,当我添加并立即查询新数据时,新数据并不存在。
你可以说:“使用祖先来避免最终的一致性”。书是根实体,为了性能,在这个级别使用祖先不是一个好主意。
因此,我们的想法是尽可能少地从数据存储中读取数据,并同步 memcache。
现在我的代码不起作用:
class Book(ndb.Model):
""" A Book """
title = ndb.StringProperty(required=True)
author = ndb.StringProperty(required=True)
@classmethod
def getAll(cls):
key = 'books'
books = memcache.get(key)
if books is None:
books = list(Book.query().order(Book.title).fetch(100))
if not memcache.set(key, books):
logging.error('Memcache set failed for key %s.', key)
else:
logging.info('Memcache hit for key %s.', key)
return books
@classmethod
def addMemcache(cls, newdata):
mylist = memcache.get('books')
if mylist:
mylist.insert(0, newdata)
if not memcache.set('books', mylist):
logging.error('Memcache set failed for key books.')
# This saves the data comming from the form
@classmethod
def save(cls, **kwargs):
book = Book(title=kwargs['title'],
author=kwargs['author']
)
# Save
book.put()
# Add to memcache for this key
logging.info('Adding to Memcache for key books.')
cls.addMemcache([book.title, book.author])
return book
现在我只是在列表的开头插入。我的代码的问题是,当我添加到 memcache 时,我缺少某种属性,因为 jinja 模板说“UndefinedError: 'list object' has no attribute 'title'”,当试图表示这一行时:
<td>{{ line.title[:40]|escape }}</td>
这很明显,因为它是一个列表,而不是具有属性的对象。但是为什么当我在函数 getAll() 的列表中转换对象时它会起作用,使 books = list(the_query)?
我的其他问题将是如何修改特定的书(在这种情况下,我可以刷新 de memcache 并再次阅读,因为我认为没有最终的一致性问题)以及如何删除(如果 2,如何识别列表中的唯一元素书名相同)。
有什么建议吗?或者我必须更改我的解决方案来解决 memcache 同步的问题吗?