Иерархический кеш в Django - PullRequest
       6

Иерархический кеш в Django

5 голосов
/ 21 февраля 2011

Я хочу пометить некоторые значения в кэше как связанные, чтобы я мог их сразу удалить. Например, когда я вставляю новую запись в базу данных, я хочу удалить все в кэше, которое было основано на старых значениях в базе данных.

Я всегда мог использовать cache.clear (), но мне это кажется слишком жестоким. Или я мог бы хранить связанные значения вместе в словаре и кэшировать этот словарь. Или я мог бы поддерживать какой-то индекс в дополнительном поле в кеше. Но мне все кажется сложным (в конце концов, медленно?).

Что ты думаешь? Есть ли какое-либо существующее решение? Или мой подход неверен? Спасибо за ответы.

Ответы [ 2 ]

5 голосов
/ 21 февраля 2011

Используете ли вы кеш API?Похоже на это.

Этот пост , который указал мне на эти слайды , помог мне создать хорошую систему кэширования поколений, которая позволила бы мне создать нужную иерархию.

Короче говоря, вы храните ключ генерации (например, 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
0 голосов
/ 21 февраля 2011

Кэширование dict или чего-то сериализованного (с JSON или подобным) звучит хорошо для меня.Бэкэнды кэша - это хранилища значений ключей, такие как memcache, они не иерархичны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...