Шаблоны для работы с кэшированием memcache в Django - PullRequest
4 голосов
/ 04 декабря 2009

У меня большой проект Django с несколькими взаимосвязанными проектами и большим количеством кэширования. В настоящее время в нем есть файл, в котором хранятся вспомогательные функции кэша. Так, например, get_object_x (id) проверит кэш для этого объекта, и если его там нет, перейдите в БД, извлеките его оттуда и верните, кэшируя по пути. Этот же шаблон используется для кэширования групп объектов, а файл также используется для методов аннулирования.

Однако при импорте между приложениями возникла проблема. В файле моделей приложений есть несколько вспомогательных функций, для которых мы хотим использовать кеш, и файл cache_helpers, очевидно, должен импортировать файл моделей.

Итак, мой вопрос: как лучше сделать это, чтобы не подвергать код круговым проблемам импорта (или, может быть, просто более умному способу в целом)? В идеале мы могли бы сделать недействительным лучше и менее ручным способом. Я предполагаю, что лучше всего начать с использования пользовательских менеджеров и сигналов Django, полностью избавившись от файла cache_helpers, но есть ли у кого-нибудь лучшие предложения или указания относительно того, где искать?

Ответы [ 2 ]

7 голосов
/ 04 декабря 2009

Обычный шаблон Python для избежания циклического импорта - поместить один набор импортов в зависимые функции:

# module_a.py
import module_b

def foo():
    return "bar"

def bar():
    return module_b.baz()

# module_b.py
def baz():
    import module_a
    return module_a.foo()

Что касается кеширования, похоже, вам нужна функция, которая выглядит примерно так:

def get_cached(model, **kwargs):
    timeout = kwargs.pop('timeout', 60 * 60)
    key = '%s:%s' % (model, kwargs)
    result = cache.get(key)
    if result is None:
        result = model.objects.get(**kwargs)
        cache.set(key, result, timeout)
    return result

Теперь вам не нужно создавать методы "getbyid" для каждой из ваших моделей. Вы можете сделать это вместо:

blog_entry = get_cached(BlogEntry, pk = 4)

Вы можете написать аналогичные функции для работы с полными QuerySets вместо отдельных объектов модели, используя метод .get ().

3 голосов
/ 04 декабря 2009

Поскольку вы указали, что кэшируете экземпляры модели Django ORM, взгляните на django-orm-cache , который обеспечивает автоматическое кэширование экземпляров модели и определяет, когда делать кэш недействительным.

Ваш круговой импорт не будет проблемой - все, что вам нужно сделать, это расширить модели, которые вам нужно кэшировать, из класса ormcache.models.CachedModel вместо django.db.models.Model Django, и вы получите кеширование «бесплатно».

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