gpt4 book ai didi

python - GAE : how to add new data in a memcache var

转载 作者:太空宇宙 更新时间:2023-11-04 10:47:00 25 4
gpt4 key购买 nike

我现在被屏蔽了。

问题是这样的:我有一个存储在 memcache 中的书籍列表的“ View ”。如果我添加一本新书,我想将新书添加到存储书籍列表的 memcache 变量中。更新和删除相同。

您可以说:“您可以刷新 key 并再次收集所有数据”。但是由于最终一致性,当我添加并立即查询新数据时,新数据还不存在。

您可以说:“使用祖先来避免最终一致性”。书籍是根实体,为了性能,在此级别使用祖先并不是一个好主意。

因此,我们的想法是尽可能少地从数据存储中读取数据,并同步内存缓存。

现在我的代码不起作用:

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)?

我的其他问题将是如何修改一本特定的书(在这种情况下我可以刷新内存缓存并再次阅读,因为我认为不存在最终一致性问题)以及如何删除(如何识别其中的唯一元素)列出 2 本书是否具有相同的名称)。

有什么建议吗?或者我必须更改我的解决方案以解决已同步 memcache 的问题?

最佳答案

设置内存缓存值时,您正在做两件不同的事情。在 getAll 中,在缓存未命中时,您执行 memcache.set(key, books),其中 books 是 Book 实例的列表。但是在 addMemcache(由 save 调用) 中,您插入一个列表列表,其中内部列表是书名和作者。因此,正如您所注意到的,当您从缓存中获取值时,它们是实例和列表的混合体。

似乎保存中的行应该是:

cls.addMemcache(book)

这样您就可以始终将 Book 实例设置到缓存中。

(另请注意,我可能会将 addMemcache 设为普通实例方法而不是类方法,这会将 self 添加到 memcache 列表中。保存时它会是最好实例化 cls 而不是显式调用 Book,以防你继承子类。)

关于python - GAE : how to add new data in a memcache var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16688269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com