Уровни кеша
Django предоставляет следующие уровни кеша, перечисленные здесь в порядке возрастания гранулярности:
Низкоуровневый API кеша: обеспечивает высочайшую степень гранулярности. Позволяет кешировать конкретные запросы или вычисления;
Кеш шаблона: позволяет кешировать фрагменты шаблона;
Кеш представлений: обеспечивает кеширование отдельных представлений;
Сайтовый кеш: кеш самого высокого уровня. Он кеширует весь сайт.
Давайте начнём и первым делом научимся использовать низкоуровневый API кеша в исходном коде Python.
Использование низкоуровневого API кеша
Низкоуровневый API кеша позволяет хранить объекты в кеше с любой степенью гранулярности. Он находится в django.core.cache и импортируется следующим образом:
from django.core.cache import cache
Он использует предустановленный (или дефолтный) кеш. Это эквивалентно caches['default'].
Доступ к конкретному кешу также возможен по его псевдониму:
from django.core.cache import caches
my_cache = caches['alias']
Давайте взглянем на работу API кеша. Следующей ниже командой запустите Shell Django:
python manage.py shell
Исполните такой исходный код:
from django.core.cache import cache
cache.set('author', 'Wes McKinney', 20)
Вы обращаетесь к используемому по умолчанию кэш-бэкенду и применяете метод set(key, value, timeout), чтобы создать и хранить ключ с именем author со значением в виде строкового литерала Wes McKinney в течение 20 секунд.
Если вы укажете тайм-аут равный 0, срок действия ключа истекает мгновенно. При тайм-ауте равным None срок действия ключа никогда не истечёт.
Если вы не укажете тайм-аут, то Django будет использовать тайм-аут, который указан для кэш-бэкенда в настроечном параметре CACHES. Если он не задан в настроечном параметре CACHES, то используется значение по умолчанию 300 секунд.
Для создания ключей можно использовать и метод add(key, value, timeout), единственное его отличие от метода set() в том, что метод add() не может обновлять значения существующих ключей, он может их только создавать.
Теперь исполните следующий ниже исходный код:
cache.get('author')
В результате получим строку:
'Wes McKinney'
Вы извлекли ключ из кэша с помощью метода get(key), теперь подождите 20 секунд и исполните тот же исходный код:
cache.get('author')
На этот раз значение не возвращается. Срок действия ключа author кэша истек, и метод get() возвращает None, потому что ключа больше в кэше нет.
Давайте с помощью следующего ниже исходного кода занесём в кэш набор запросов QuerySet:
from books.models import Book
book_list = Book.objects.all()
cache.set('cached_book_list', book_list)
Здесь набор запросов QuerySet исполняется на модели Book, и возвращенные объекты сохраняются в ключе cached_book_list.
Теперь давайте извлечем кэшированные данные:
cache.get('cached_book_list')
В результате получим сохранённые в кэше объекты модели Book:
<QuerySet [<Book: Python и анализ данных>, <Book: Изучаем Python. Том 1>, <Book: Изучаем Python. Том 2>, <Book: Программируем на Python>, <Book: Python. Книга рецептов>, <Book: Python – это просто>, <Book: Знакомство с Python>, <Book: Python. К вершинам мастерства>, <Book: Непрактичный Python>, <Book: Python без проблем>]>
Данный пример наглядно показывает как можно кэшировать наборы запросов QuerySet.