johnny-cache - кэширование SQL-запросов в Django

Оказывается, Джонни Кэш — это не только имя легендарного кантри-певца. Такое же название носит модуль для кэширования SQL-запросов в Django.

Суть его действия заключается в том, что он кэширует результат выполнения всех SELECT'ов в memcached. Кэш сбрасывается при выполнении INSERT, UPDATE или DELETE для соответствующей таблицы. Если SELECT выбирает данные из нескольких таблиц, то кэш для этого запроса сбросится, если будет выполнена запись в любую из них.

Подключить такое кэширование предельно просто. КО рекомендует начать с установки пакета johnny—cache, который можно скачать с PyPI или вытянуть из mercurial-репозитория. Затем нужно внести следующие изменения в settings.py:

1. Добавить jhonny в список установленных приложений

1
2
3
4
INSTALLED_APPS = (
    # ...
    'johnny',
)

Это делать не обязательно, будет работать и так. Чисто декоративный момент.

2. Подключить middleware

1
2
3
4
5
MIDDLEWARE_CLASSES = (
    'johnny.middleware.LocalStoreClearMiddleware',
    'johnny.middleware.QueryCacheMiddleware',
    # ...
)

А вот это нужно сделать обязательно, иначе ничего не получится.

3. И, наконец, настроить кэширующий бэкенд

1
2
CACHE_BACKEND = 'johnny.backends.memcached://localhost:11211'
JOHNNY_MIDDLEWARE_KEY_PREFIX='jc_myproj'

В CACHE_BACKEND указывается хост/порт memcached. В данном случае это localhost:11211.

JOHNNY_MIDDLEWARE_KEY_PREFIX — это префикс для ключей memcached. Он нужен, чтобы избежать конфликтов с другими проектами, которые используют тот же кэш. Соответственно, он должен быть уникальным для каждого проекта.

После этих нехитрых манипуляций перезагрузите люблю страницу вашего сайта и наслаждайтесь заветным нулём во вкладке "SQL" в debug-toolbar.

Однако, я советую хорошенько подумать над тем, насколько это подойдёт для вашего конкретного приложения. Дело в том, что при таком подходе кэшироваться будут только SQL-запросы. Если приложение пишет в базу достаточно часто, то эффективность такого кэширования ощутимо понизится. К тому же, узким местом являются не только запросы к базе. Кэшировать нужно и другие "дорогие" операции. А ведь память не резиновая, на всех может и не хватить.

С другой стороны, johnny-cache позволяет повысить производительность с минимальным количеством телодвижений. В частности, скорость генерации главной страницы моего бложика повысилась на 30% (при испытании в тепличных условиях). При этом, использовать дополнительное кэширование помимо johnny-cache мне лениво, да и нет необходимости. Так что для меня этот вариант вполне подходит.

Сайт проекта johnny-cache с более-менее подробной документацией.