johnny-cache - кэширование SQL-запросов в Django
Оказывается, Джонни Кэш — это не только имя легендарного кантри-певца. Такое же название носит модуль для кэширования SQL-запросов в Django.
Суть его действия заключается в том, что он кэширует результат выполнения всех SELECT
'ов в memcached. Кэш сбрасывается при выполнении INSERT
, UPDATE
или DELETE
для соответствующей таблицы. Если SELECT
выбирает данные из нескольких таблиц, то кэш для этого запроса сбросится, если будет выполнена запись в любую из них.
Подключить такое кэширование предельно просто. КО рекомендует начать с установки пакета johnny—cache
, который можно скачать с PyPI или вытянуть из mercurial-репозитория. Затем нужно внести следующие изменения в settings.py
:
1. Добавить jhonny
в список установленных приложений
INSTALLED_APPS = (
# ...
'johnny',
)
Это делать не обязательно, будет работать и так. Чисто декоративный момент.
2. Подключить middleware
MIDDLEWARE_CLASSES = (
'johnny.middleware.LocalStoreClearMiddleware',
'johnny.middleware.QueryCacheMiddleware',
# ...
)
А вот это нужно сделать обязательно, иначе ничего не получится.
3. И, наконец, настроить кэширующий бэкенд
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 с более-менее подробной документацией.