Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

10.3 Уровни кэша в Django
7 из 16 шагов пройдено
0 из 27 баллов  получено

Уровни кеша

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.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

тут ситуация немножко другая

Давайте взглянем на работу 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, потому что ключа больше в кэше нет.



если ключ истек то Шелл ничего не вернет это учтите!
 

In [4]: from django.core.cache import cache
   ...: cache.set('author', 'Wes McKinney', 20)

In [5]: cache.get('author')
Out[5]: 'Wes McKinney'

In [6]: cache.get('author')
 

смотрите тут такая же ситуация после установки мемкеша его нужно запустить в терминале 

memcached -p 11211


а потом уже:

можно выполнять этот код иначе будет ошибка

 

Давайте взглянем на работу 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 секунд.

Изменен No Name