2012-07-05 70 views
0

我正在谷歌應用程序引擎上使用python和jinja2構建一個web應用程序。我有一個網站,用戶可以寫文章,我有15個主要類別,每個有4個部門。現在我想實現內存緩存,因爲我有一個20:1的閱讀器與海報比例,但我怎麼能做到這一點,而不需要製作60個不同的鍵?我應該這樣做嗎?或者我應該打在數據庫和結果進行排序,並且對能使那些結果,像這樣的功能的一些參數:如何實現許多類別的memcache

def posts_cache(update = False, category = None, sport = None): 
     key = 'main' 
     posts = memcache.get(key) 
     if posts is None or update: 
       logging.error("DB QUERY") 
       posts = db.GqlQuery("SELECT * " 
             "FROM Post " 
             "ORDER BY created DESC " 
             "LIMIT 100", 
             key) 
       posts = list(posts) 
       memcache.set(key, posts) 
     if category and sport: 
      sportcatlist = [] 
      for post in posts: 
        if post.category == category: 
         if post.sport == sport: 
          sportcatlist.append(post) 
      return sportcatlist 
     elif category: 
      categorylist = [] 
      for post in posts: 
        if post.category == category: 
          categorylist.append(post) 
      return categorylist 
     elif sport: 
      sportlist = [] 
      for post in posts: 
        if post.sport == sport: 
          sportlist.append(post) 
      return sportlist 
     return posts 

或者是有一個更有效的方式來做到這一點?

+0

我不認爲你的解決方案會擴展。如果您獲得大量帖子,那麼您將無法將這些詳細信息填充到單個memcache記錄中(確定您當前將結果集限制爲100)。我認爲你應該考慮分割緩存 - 每個分類一次。另外,我覺得你可以通過在創建帖子時爲每個類別創建簡要記錄來提高效率。然後,當您獲取這些內容時,將它們緩存在內存緩存中。 (並在更新類別時使緩存無效)。 – 2012-07-06 00:52:07

+0

還算不錯,我想我可能不得不在某個時間點頭。簡要記錄是什麼意思?在這種情況下他們會持有什麼? – clifgray 2012-07-06 04:57:33

+0

那麼每次添加帖子時,您都可以更新一個類別記錄,該記錄包含該類別的最近n個帖子。然後,您可以從緩存中獲取前n個文章,如果沒有緩存,則使用db.get(category_record鍵)而不是查詢。這意味着您可以在寫入而不是查詢時進行所有類別的篩選。 – 2012-07-06 07:48:27

回答

1

更有效地做到這一點的一種可能方式是按類別和'post_%s(post_key')分別按預定義的鍵格式('category_%s(category_name)')分別緩存每個類別的帖子和內容的列表)'。首先包含列表文章的關鍵字(可能包含一些元信息,如需要的話最後更新日期,第二個 - 按鍵的帖子內容)在'關鍵'中,我的意思是序列化的數據存儲區密鑰或數據存儲區中的標識或者其他你可以用來簡單地從數據存儲中讀取文章的內容,如果它不在memcache中分別存儲每個特定的文章和類別內容,即使在巨大的負載下也是有效的,包括更新後更新後的單個內存緩存鍵失效,通過添加/刪除文章您使單個類別的列表無效,所有其他memcached數據仍然存在,所以其他請求僅由memcache處理。由於appengine強制限制o n的數據量可以存儲在內存緩存中,它會刪除舊的和罕見的命中項並保持經常使用,這正是你所需要的,並且完全可以縮放,你描述的方法不會給你這個。 希望它有幫助。