0

memcache を使用してデータベースの負荷を軽減する方法を学ぼうとしています。そのため、キー (この場合は「エントリ」) が与えられたときにブログ投稿をキャッシュするcacheData関数があります。問題は、ブログに新しい投稿を作成してデータベース クエリを実行すると、新しい投稿がデータベースに追加されているにもかかわらず、値が返されないことです。データベース クエリの後にエントリが返されないのはなぜですか?

cacheData 関数:

def cacheData(key, update = False):
     value = memcache.get(key)
     if value is None or update:
         logging.error("DATABASE HIT")
         value = db.GqlQuery("select * from Entry order by date desc")
         value = list(value) #returns 0 when entry is added...
         logging.error("value has: " + str(len(value)) + " items")
         memcache.set(key,value)
     return value

そして、これはデータベースにデータを入力するメソッドです:

def post(self):

    error = "You are missing a title or blog entry!"
    title = self.request.get("subject")
    blog = self.request.get("content")

    if (title and blog):
        blogEntry = Entry(title = title, blogText = blog)
        blogEntry.put()
        cacheData("entries", update = True)
        self.redirect("/blog")

    else:
        self.renderPostPage(title = title, blog = blog, error = error)
4

1 に答える 1

0

結果整合性の問題である可能性があります。不思議なことに、あなたの cacheData は memcache から 1 つのエントリのみをフェッチしようとし、* (すべてのエンティティをフェッチ) を選択します。キーでフェッチしようとすると、強い一貫性があると思います。もう 1 つの回避策は、.put() を呼び出してデータストアにデータを保持した後、memcache も更新することです。

于 2013-04-21T21:44:45.700 に答える