如何为许多类别实现memcache

时间:2012-07-05 16:20:29

标签: python google-app-engine memcached

我正在使用python和jinja2在谷歌应用引擎上构建一个Web应用程序。我有一个网站,用户可以写帖子,我有15个主要类别,每个类别有4个部门。现在我想实现内存缓存,因为我有20:1的阅读器到海报比例,但是如何在不制作60个不同密钥的情况下实现呢?我应该这样做吗?或者我应该点击数据库并对结果进行排序,并在函数上有一些参数来获得这些结果:

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

或者有更有效的方法吗?

1 个答案:

答案 0 :(得分:1)

更有效地执行此操作的一种可能方法是按预定义的密钥格式(类别的'category_%s(category_name)'和'post_%s(post_key)分别缓存每个类别的帖子列表和帖子内容'。首先包含列表帖子的密钥(可能包含一些元信息,如上次更新日期,如果需要,第二个 - 按密钥发布的内容)。在'key'下我指的是数据存储区中的序列化数据存储区密钥或id或如果它不在memcache中,您可以使用其他东西来简单地从数据存储中读取帖子。即使在巨大的负载下也可以高效地存储每个特定的帖子和类别内容,包括更新,因为更新的帖子使单个memcache密钥无效,通过添加/删除发布你单个类别的列表无效,所有其他memcached数据仍然存在,所以其他请求只由memcache处理。由于appengine强制限制数据量可以存储在memcache中,它将删除旧的和罕见的命中项目并保持经常使用哪个我正是你需要的东西和完美的尺度,你描述的方法不会给你这个。 希望它有所帮助。