私は今ブロックされています。
問題は次のとおりです。memcache に保存されている本のリストの「ビュー」があります。新しい本を追加する場合は、本のリストを格納する 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 に ADD すると、ジンジャ テンプレートに「UndefinedError: 'list object' has no attribute 'title'」と表示されるため、ある種のプロパティが欠落していることです。
<td>{{ line.title[:40]|escape }}</td>
プロパティを持つオブジェクトではなくリストであるため、これは明らかです。しかし、関数 getAll() でリスト内のオブジェクトを変換し、books = list(the_query) を作成すると、なぜ機能するのでしょうか?
私の他の問題は、特定の本を変更する方法(この場合、memcacheをフラッシュして再度読み取ることができます。結果整合性の問題はないと思います)と削除する方法(2の場合にリスト内の一意の要素を識別する方法)です。本は同じ名前です)。
なにか提案を?または、memcache を同期させるという問題に対する解決策を変更する必要がありますか?