Метод get_or_set

Метод get_or_set применяется к объекту кеша и возвращает значение по указанному ключу. Если значение не найдено, метод вызывает переданную функцию или использует значение по умолчанию для вычисления нового значения, сохраняет его в кеш и возвращает его. Это удобный способ кеширования тяжелых вычислений с автоматическим обновлением.

Синтаксис

pythoncache.get_or_set(key, default, timeout=None, version=None)

Параметры метода:

Пример . С использованием значения по умолчанию

Давайте получим из кеша количество статей, а если его нет, установим значение 10:

pythonfrom django.core.cache import cache

# Получаем значение из кеша или устанавливаем 10
articles_count = cache.get_or_set('articles_count', 10)
print(articles_count)

Результат выполнения кода:

python"10"

Пример . С использованием вызываемой функции

Давайте получим из кеша список популярных статей, а если его нет, вызовем функцию для вычисления:

pythonfrom 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)

Результат выполнения кода:

python"article 1"
"article 3"
"article 5"

Пример . С установкой таймаута

Давайте получим из кеша общее количество пользователей, а если его нет, установим значение с таймаутом 60 секунд:

pythonfrom 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)

Результат выполнения кода:

python"42"

Пример . С ленивым вычислением через lambda

Давайте получим из кеша список категорий, используя лямбда-функцию для вычисления:

pythonfrom 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)

Результат выполнения кода:

python"category 1"
"category 2"
"category 3"

Смотрите также

  • метод get,
    который получает значение из кеша по ключу
  • метод set,
    который устанавливает значение в кеш по ключу
  • метод add,
    который добавляет значение в кеш только если ключ отсутствует
  • метод get_many,
    который получает несколько значений из кеша за один вызов