Метод get_or_set
Метод get_or_set применяется к объекту кеша и возвращает
значение по указанному ключу. Если значение не найдено,
метод вызывает переданную функцию или использует значение
по умолчанию для вычисления нового значения, сохраняет
его в кеш и возвращает его. Это удобный способ кеширования
тяжелых вычислений с автоматическим обновлением.
Синтаксис
cache.get_or_set(key, default, timeout=None, version=None)
Параметры метода:
-
key- строка, ключ для получения/установки значения в кеше; -
default- значение по умолчанию или вызываемый объект (функция), который будет использован для получения значения, если ключ отсутствует; -
timeout- время жизни кеша в секундах (по умолчанию используется глобальный таймаут); -
version- версия ключа, используется для дополнительного управления кешем.
Пример . С использованием значения по умолчанию
Давайте получим из кеша количество статей, а если его нет,
установим значение 10:
from django.core.cache import cache
# Получаем значение из кеша или устанавливаем 10
articles_count = cache.get_or_set('articles_count', 10)
print(articles_count)
Результат выполнения кода:
"10"
Пример . С использованием вызываемой функции
Давайте получим из кеша список популярных статей, а если его нет, вызовем функцию для вычисления:
from django.core.cache import cache
from myapp.models import Article
def get_popular_articles():
# Сложный запрос к базе данных
return list(Article.objects.filter(is_popular=True))
# Получаем из кеша или вычисляем через функцию
popular = cache.get_or_set('popular_articles', get_popular_articles)
for article in popular:
print(article.title)
Результат выполнения кода:
"article 1"
"article 3"
"article 5"
Пример . С установкой таймаута
Давайте получим из кеша общее количество пользователей,
а если его нет, установим значение с таймаутом 60 секунд:
from django.core.cache import cache
from myapp.models import User
# Получаем из кеша или устанавливаем с таймаутом
users_count = cache.get_or_set(
'users_count',
User.objects.count,
timeout=60
)
print(users_count)
Результат выполнения кода:
"42"
Пример . С ленивым вычислением через lambda
Давайте получим из кеша список категорий, используя лямбда-функцию для вычисления:
from django.core.cache import cache
from myapp.models import Category
# Ленивое вычисление через lambda
categories = cache.get_or_set(
'all_categories',
lambda: list(Category.objects.all())
)
for category in categories:
print(category.name)
Результат выполнения кода:
"category 1"
"category 2"
"category 3"