[Система кэширования в Django] Подробное сравнение и лучшие практики Redis и Memcached
[Система кэширования в Django] Подробное сравнение и лучшие практики Redis и Memcached

При разработке веб-приложений системы кэширования являются одним из ключевых инструментов повышения производительности и сокращения времени отклика. Django предоставляет встроенную среду кэширования, которая может легко интегрировать несколько серверов кэширования. Двумя наиболее популярными бэкэндами являются Redis и Memcached. В этой статье мы рассмотрим их сравнение и приведем несколько примеров кода для их использования в Django.

Redis vs. Memcached

1. Структура данных
  • Redis: Redis — это система хранения данных в памяти, которая поддерживает различные структуры данных, такие как строки, хеши, списки, наборы и т. д. Он также предоставляет параметры сохранения данных на диске, чтобы их можно было восстановить после перезагрузки.
  • Memcached: Memcached также является системой кэширования в памяти, но ее структура хранения данных относительно проста и поддерживает только пары ключ-значение. Он не обеспечивает поддержку персистентности, все данные хранятся в памяти и будут потеряны после перезагрузки.
2. Производительность
  • Redis: Поскольку Redis поддерживает больше структур данных и более богатую функциональность, в некоторых случаях он может быть быстрее, чем Memcached. Кроме того, опция сохранения данных Redis делает его более подходящим для сценариев приложений, требующих сохранения данных.
  • Memcached: Memcached ориентирован на кэширование, поэтому в некоторых случаях может быть быстрее Redis. Его простой и целенаправленный дизайн позволяет ему отлично справляться с обработкой большого количества простых пар ключ-значение.
3. Развертывание и обслуживание
  • Redis: Развертывание и поддержка Redis относительно сложны, поскольку требуют настройки параметров сохранения и регулярного резервного копирования данных для обеспечения надежности. Но после настройки Redis, как правило, становится очень стабильным и мощным.
  • Memcached: Memcached относительно прост в развертывании и обслуживании, поскольку его конструкция проще и понятнее. Однако необходимость резервного копирования и восстановления данных может быть более сложной из-за отсутствия поддержки постоянства.

Использование Redis и Memcached с Django

Установка и настройка

первый,Требуется установка Redis или Memcached.,и вDjangoизsettings.pyНастроить в файле。Ниже приводится простойиз Пример:

Язык кода:python
кодКоличество запусков:0
копировать
# settings.py

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}
Язык кода:python
кодКоличество запусков:0
копировать
# Или используйте Memcached
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}
Использовать кеширование

После завершения настройки вы можете использовать его в Django. Вот простой пример:

Язык кода:python
кодКоличество запусков:0
копировать
from django.core.cache import cache

# данные кэша
cache.set('my_key', 'my_value', timeout=3600)

# Получить данные из кэша
value = cache.get('my_key')
if value is not None:
    print("Value from cache:", value)
else:
    print("Cache miss")

# удалитьданные кэша
cache.delete('my_key')

Дальнейшая оптимизация

Дальнейшая оптимизация производительности и надежности при использовании Redis или Memcached.

1. Сериализация данных

По умолчанию Django использует Pickle в качестве формата сериализации данных. Однако у Pickle есть некоторые проблемы с безопасностью и производительностью. Рассмотрите возможность использования более безопасного и эффективного формата сериализации, такого как JSON.

Язык кода:python
кодКоличество запусков:0
копировать
# settings.py

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'SERIALIZER': 'django_redis.serializers.JSONSerializer',
        }
    }
}
2. Стратегия аннулирования кэша

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

Язык кода:python
кодКоличество запусков:0
копировать
# Установите срок действия кэша на 1 час.
cache.set('my_key', 'my_value', timeout=3600)
3. Распределенный кеш

Если вашему приложению необходимо обрабатывать большое количество одновременных запросов, рассмотрите возможность использования распределенной системы кэширования, такой как Redis Cluster или Memcached Cluster, для повышения производительности и масштабируемости.

Язык кода:python
кодКоличество запусков:0
копировать
# Пример конфигурации кластера Redis
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': [
            'redis://127.0.0.1:6379/1',
            'redis://127.0.0.1:6379/2',
            'redis://127.0.0.1:6379/3',
        ],
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.ShardClient',
        }
    }
}
4. Мониторинг и протоколирование

Регулярный мониторинг производительности и доступности вашей системы кэширования — важный шаг в обеспечении стабильной работы вашего приложения. В то же время журналирование операций с кэшем может помочь своевременно выявить и устранить потенциальные проблемы.

Язык кода:python
кодКоличество запусков:0
копировать
# Настройка ведения журнала Django
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/path/to/django_cache.log',
        },
    },
    'loggers': {
        'django.cache': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

Со временем в кэше может накопиться большое количество устаревших или уже не используемых данных, которые могут занимать дополнительную память или место для хранения. Регулярная очистка кэша обеспечивает производительность и использование пространства системы кэширования.

Язык кода:python
кодКоличество запусков:0
копировать
# Регулярно очищайте кеш
from django.core.cache import cache
from django.core.management import BaseCommand
from django.conf import settings
import time

class Command(BaseCommand):
    help = 'Clear expired cache keys'

    def handle(self, *args, **options):
        while True:
            cache.clear_expired()
            time.sleep(settings.CACHE_CLEAR_INTERVAL)
5. Высокая доступность и отказоустойчивость.

Чтобы обеспечить высокую доступность и отказоустойчивость системы кэширования, вы можете рассмотреть возможность использования таких технологий, как репликация «главный-подчиненный», кластеризация и персистентность.

Язык кода:python
кодКоличество запусков:0
копировать
# Пример конфигурации Redis master-slave
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/0',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'CONNECTION_POOL_CLASS': 'redis.ConnectionPool',
            'CONNECTION_POOL_CLASS_KWARGS': {
                'max_connections': 20,
            },
            'SOCKET_CONNECT_TIMEOUT': 5,  # in seconds
            'SOCKET_TIMEOUT': 5,  # in seconds
        }
    }
}
6. Настройка производительности

В зависимости от характеристик приложения и условий нагрузки параметры конфигурации системы кэширования можно настроить для оптимизации производительности.

Язык кода:python
кодКоличество запусков:0
копировать
# Пример настройки пула соединений Redis
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/0',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'CONNECTION_POOL_CLASS': 'redis.ConnectionPool',
            'CONNECTION_POOL_CLASS_KWARGS': {
                'max_connections': 50,
            },
            'SOCKET_CONNECT_TIMEOUT': 3,  # in seconds
            'SOCKET_TIMEOUT': 3,  # in seconds
        }
    }
}

После развертывания системы кэширования,Проведение Тестирования и мониторинга производительности является важным шагом для обеспечения его надлежащего функционирования. Для тестирования производительности вы можете использовать такие инструменты, как redis-benchmark Redis или memtier Memcached.,И используйте инструменты мониторинга, такие как Prometheus и Grafana, для мониторинга различных показателей системы кэширования.

7. Пользовательский кэш-сервер

В некоторых случаях может потребоваться реализация пользовательского кэша для удовлетворения конкретных потребностей или интеграция с конкретной системой хранения.

Язык кода:python
кодКоличество запусков:0
копировать
# Пользовательский сервер пример кэширования
from django.core.cache.backends.base import BaseCache

class CustomCache(BaseCache):
    def __init__(self,params):
        # инициализация Пользовательский сервер кэширования

    def add(self, key, value, timeout=None, version=None):
        # Реализация добавления данных кэшаизлогика

    def get(self, key, default=None, version=None):
        # Реализуйте получение данных кэшаизлогика

    def set(self, key, value, timeout=None, version=None):
        # Настройки реализацииданные кэшаизлогика

    def delete(self, key, version=None):
        # выполнитьудалитьданные кэшаизлогика

# Настройте использование Пользовательского в settings.py. сервер кэширования
CACHES = {
    'default': {
        'BACKEND': 'path.to.CustomCache',
    }
}
8. Восстановление после сбоев и отказоустойчивость

В производственной среде критически важны восстановление после сбоев и отказоустойчивость. Системы мониторинга могут использоваться для автоматического обнаружения и устранения неисправностей, а также могут быть приняты соответствующие стратегии отказоустойчивости для обработки сбоев системы кэширования.

Язык кода:python
кодКоличество запусков:0
копировать
# Пример: реализация обнаружения сбоев и восстановления с использованием сигналов Django.
from django.core.cache import cache
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save)
def check_cache_health(sender, **kwargs):
    try:
        # Проверьте, правильно ли работает система кэширования
        cache.set('_cache_health_check', 'OK', timeout=10)
    except Exception as e:
        # Сбой системы кэша, выполните соответствующие операции восстановления.
        # Может отправлять оповещения для уведомления администраторов или выполнения других действий.
        pass
  • Выберите подходящую систему кэширования и параметры конфигурации и настройте их в соответствии с потребностями вашего приложения.
  • Проводите регулярные проверки для своевременного выявления и устранения потенциальных проблем.
  • Внедрите настраиваемую серверную часть кэша или механизм восстановления после сбоев, чтобы справиться с потребностями и условиями сбоя в конкретных сценариях.

Используя приведенные выше рекомендации и методы оптимизации, вы можете быть уверены, что преимущества Redis и Memcached полностью используются в приложениях Django для повышения производительности, масштабируемости и стабильности.

Когда используется система кеширования,Необходимо обратить внимание на вопросы безопасности,Чтобы предотвратить уязвимости безопасности, такие как утечка конфиденциальных данных или отравление кэша.

Схема проектирования системы Python + Memcached
Схема проектирования системы Python + Memcached
9. Обработка конфиденциальных данных

Убедитесь, что вы не храните в кеше конфиденциальные данные, особенно конфиденциальную информацию, такую ​​как пароли, ключи или сеансы пользователей. Технология шифрования может использоваться для шифрования конфиденциальных данных перед их сохранением.

Язык кода:python
кодКоличество запусков:0
копировать
# Пример. Использование криптографии для шифрования конфиденциальных данных.
import hashlib

def encrypt_data(data):
    # Шифрование данных с использованием алгоритма хеширования
    return hashlib.sha256(data.encode()).hexdigest()

encrypted_password = encrypt_data('my_password')
cache.set('encrypted_password', encrypted_password)
10. Защита от отравления кэша

Отравление кеша — это когда злоумышленник влияет на поведение приложения, манипулируя кешированными данными. Чтобы предотвратить отравление кэша, можно использовать такие методы, как случайные имена ключей, время истечения срока действия и защита от хотлинкинга, чтобы увеличить сложность для злоумышленников.

Язык кода:python
кодКоличество запусков:0
копировать
# Пример. Используйте случайные имена ключей и сроки их действия, чтобы предотвратить отравление кеша.
import uuid

def generate_random_key():
    # Генерировать случайные имена ключей
    return str(uuid.uuid4())

random_key = generate_random_key()
cache.set(random_key, 'my_value', timeout=3600)
  • Регулярно проверяйте и обновляйте конфигурацию безопасности системы кэширования, чтобы обеспечить применение последних обновлений безопасности и лучших практик.
  • Строго проверяйте и фильтруйте вводимые пользователем данные, чтобы предотвратить уязвимости безопасности, такие как внедрение кэша.
  • Внедрите политики контроля доступа, чтобы ограничить доступ к системе кэширования только авторизованным пользователям или приложениям.
  • Отслеживайте журналы доступа и аномалии системы кэширования, чтобы своевременно обнаруживать и устранять потенциальные угрозы безопасности.

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

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

11. Функция публикации/подписки

Redis предоставляет мощные функции публикации/подписки, которые можно использовать для реализации обмена сообщениями в реальном времени, уведомления о событиях и координации распределенных систем. Вы можете использовать функцию публикации/подписки Redis для создания приложения чата в реальном времени или системы мониторинга в реальном времени.

Язык кода:python
кодКоличество запусков:0
копировать
# Пример: функция с использованием Redis публикации/подписки позволяют обмениваться сообщениями в режиме реального времени
import redis

# Издатель
publisher = redis.StrictRedis(host='localhost', port=6379, db=0)
publisher.publish('channel', 'Hello, world!')

# подписчик
subscriber = redis.StrictRedis(host='localhost', port=6379, db=0)
pubsub = subscriber.pubsub()
pubsub.subscribe('channel')
for item in pubsub.listen():
    print(item)
12. Распределение и сегментирование данных

Если объем кэшированных данных велик, вы можете рассмотреть возможность использования технологии распределения и сегментирования данных для повышения производительности и масштабируемости. Redis предоставляет функции распределенной кластеризации и сегментирования данных, которые могут распределять данные по нескольким узлам для достижения горизонтального расширения и балансировки нагрузки.

Язык кода:python
кодКоличество запусков:0
копировать
# Пример: реализация Распределения с использованием Redis Cluster и сегментирование данных
from rediscluster import RedisCluster

startup_nodes = [{"host": "127.0.0.1", "port": "7000"}]
rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)

rc.set('my_key', 'my_value')
value = rc.get('my_key')
print(value)

Постоянная оптимизация и улучшение

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

Постоянно Постоянная оптимизация и улучшение,Вы можете обеспечить высокую производительность, высокую доступность и высокий уровень безопасности системы кэширования в вашем приложении Django.,Предоставьте пользователям лучшие услуги и опыт.

Тестирование и мониторинг производительности

Помимо оптимизации и улучшения системы кэширования,Это также важный шаг для обеспечения стабильности и надежности системы. Пройден тест на производительность,Способность оценивать пропускную способность системы, время отклика и возможности параллельного выполнения.,Обнаружьте потенциальные узкие места производительности. Система мониторинга может отслеживать рабочее состояние и показатели производительности кэш-системы в режиме реального времени.,Своевременно выявляйте нештатные ситуации и принимайте соответствующие меры.

Используйте инструменты тестирования производительности
  • Redis: redis-benchmark: Инструмент тестирования производительности, входящий в состав Redis, может моделировать одновременное обращение нескольких клиентов к серверу Redis для проверки его производительности.
  • Memcached: уровень памяти: Инструмент тестирования производительности Memcached может выполнять стресс-тестирование сервера Memcached и оценивать его производительность и стабильность.
Мониторинг системных показателей
  • Пропускная способность запроса: Количество запросов, обрабатываемых в секунду, отражает возможности обработки системы кэширования.
  • Частота попаданий: Доля попаданий в кэш, то есть доля данных, полученных из кэша, напрямую влияет на производительность.
  • Время ответа: Среднее время ответа после того, как запрос достигает системы кэширования, напрямую влияет на пользовательский опыт.
  • Использование памяти: Доля памяти, используемой системой кэширования, в общем объеме памяти должна контролироваться в разумных пределах, чтобы избежать переполнения памяти.

Планы устранения неполадок и аварийного восстановления

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

  • Резервное копирование и восстановление: Регулярно создавайте резервные копии кэшированных данных и обеспечивайте возможность быстрого восстановления данных для обеспечения непрерывности бизнеса.
  • Автоматическое переключение при отказе: Используйте технологию главного-подчиненного копирования или кластера для автоматического переключения при сбое и автоматического переключения на резервный узел при выходе из строя главного узла.
  • Стратегия восстановления после сбоя: Разработайте соответствующие стратегии восстановления для различных типов сбоев, таких как сбои сети, переполнение памяти или сбои оборудования.

Подвести итог

в этой статье,Мы углубимся в использование Redis и Memcached в качестве систем кэширования в приложениях Django. первый,Сравниваем возможности Redis и Memcached,включатьструктура данных、производительность、Развертывание и Сходства и различия в обслуживании и так далее. Далее мы подробно расскажем, как настроить и использовать Redis и Memcached в Django, а также приведем примеры кода. Затем мы обсудим ряд стратегий оптимизации, включая сериализацию. данных、Стратегия аннулирования кэша、Распределенный кеш и т. д. для повышения производительности и надежности системы кэширования. Дополнительно обсуждаем вопросы безопасности, Тестирование и мониторинг производительности、Планы устранения неполадок и аварийного восстановление и другие аспекты для обеспечения стабильной работы системы кэширования в производственной среде. Наконец, мы выделили Постоянную оптимизация и улучшениеизважность,Постоянно оптимизируя и улучшая систему кэширования.,Предоставьте пользователям более стабильные и эффективные услуги.,Повысьте конкурентоспособность приложений и удобство для пользователей. В итоге,Правильно настройте и в полной мере используйте Redis и Memcached в качестве систем кэширования.,Принесет значительные улучшения производительности и надежности приложений Django.

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода