Django中的分层缓存

时间:2011-02-20 22:27:44

标签: django caching

我想要做的是将缓存中的某些值标记为相关,以便我可以立即删除它们。例如,当我向数据库插入一个新条目时,我想删除缓存中基于数据库中旧值的所有内容。

我总是可以使用cache.clear(),但这对我来说似乎太残酷了。或者我可以将相关值存储在字典中并缓存此字典。或者我可以在缓存中的额外字段中维护某种索引。但是一切似乎都很复杂(最终会变慢?)。

你怎么想?有没有现成的解决方案?或者我的方法是错的?谢谢你的回答。

2 个答案:

答案 0 :(得分:5)

您使用的是缓存API吗?听起来像。

This post,它指向these slides,帮助我创建了一个很好的世代缓存系统,让我创建了我想要的层次结构。

简而言之,您将生成密钥(例如group)存储在缓存中,并将存储在密钥创建功能中的值合并,以便您可以一次使一整套密钥无效。

使用这个基本概念,您可以创建高度复杂的层次结构或只是一个简单的组系统。

例如:

class Cache(object):
    def generate_cache_key(self, key, group=None):
        """
        Generate a cache key relating them via an outside source (group)
        Generates key such as 'group-1:KEY-your-key-here'

        Note: consider this pseudo code and definitely incomplete code.
        """
        key_fragments = [('key', key)]

        if group:
            key_fragments.append((group, cache.get(group, '1')))

        combined_key = ":".join(['%s-%s' % (name, value) for name, value in key_fragments)

        hashed_key = md5(combined_key).hexdigest()
        return hashed_key


    def increment_group(self, group):
        """
        Invalidate an entire group
        """
        cache.incr(group)


    def set(self, key, value, group=None):
        key = self.generate_cache_key(key, group)
        cache.set(key, value)


    def get(self, key, group=None):
        key = self.generate_cache_key(key, group)
        return cache.get(key)

# example
>>> cache = Cache()
>>> cache.set('key', 'value', 'somehow_related')
>>> cache.set('key2', 'value2', 'somehow_related')
>>> cache.increment_group('somehow_related')
>>> cache.get('key') # both invalidated
>>> cache.get('key2') # both invalidated

答案 1 :(得分:0)

缓存dict或序列化的东西(使用JSON等)对我来说听起来不错。缓存后端是像memcache这样的键值存储,它们不是分层的。