Django и Redis

Expire & Persist
В дополнение к простой ТТЛ запрос, вы можете отправить сохраняться конкретный ключ или указать новый тайм - аут истечения , используя persist и expire методы:

Пример использования persist метода

>>> cache.set("foo", "bar", timeout=22)
>>> cache.ttl("foo")
22
>>> cache.persist("foo")
>>> cache.ttl("foo")
None

Пример использования метода expire

>>> cache.set("foo", "bar", timeout=22)
>>> cache.expire("foo", timeout=5)
>>> cache.ttl("foo")
5

Locks
Он также поддерживает способность redis создавать распределенные именованные блокировки redis. Интерфейс блокировки идентичен, threading.Lock поэтому вы можете использовать его в качестве замены.

Пример выделения блокировки с использованием средств менеджеров контекста python.

with cache.lock("somekey"):
    do_some_thing()

Сканирование и удаление ключей навалом
Django-Redis поставляется с некоторыми дополнительными методами, которые помогают с поиском или удалением ключей с использованием шаблонов glob.

Простой поиск ключей по шаблону

>>> from django.core.cache import cache
>>> cache.keys("foo_*")
["foo_1", "foo_2"]

Подобный простой поиск вернет все совпадающие значения. В базах данных с большим количеством ключей этот метод не подходит. Вместо этого вы можете использовать iter_keys функцию, которая работает как keys функция, но использует redis> = 2.8 серверные курсоры. Вызов iter_keys вернет генератор, который вы сможете эффективно перебрать.

Поиск с использованием серверных курсоров

>>> from django.core.cache import cache
>>> cache.iter_keys("foo_*")
<generator object algo at 0x7ffa9c2713a8>
>>> next(cache.iter_keys("foo_*"))
"foo_1"

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

Пример использования delete_pattern

>>> from django.core.cache import cache
>>> cache.delete_pattern("foo_*")

Redis родные команды
django-redis имеет ограниченную поддержку некоторых атомарных операций Redis, таких как команды SETNX и INCR.

Вы можете использовать SETNX команду через set()метод backend с nx параметром:

Пример:

>>> from django.core.cache import cache
>>> cache.set("key", "value1", nx=True)
True
>>> cache.set("key", "value2", nx=True)
False
>>> cache.get("key")
"value1"

Кроме того, incr и decr методы используют повторные атомарные операции, когда для него подходит значение, содержащее ключ.

Необработанный клиентский доступ
В некоторых ситуациях вашему приложению требуется доступ к сырому клиенту Redis, чтобы использовать некоторые расширенные функции, которые не предоставляются интерфейсом кэша Django. Чтобы избежать сохранений другой настройки для создания сырьевого соединения, Джанго-Redis предоставляет функцию , с которыми вы можете получить необработанный клиент Повторного использования строки подключения кэша: get_redis_connection(alias).

>>> from django_redis import get_redis_connection
>>> con = get_redis_connection("default")
>>> con
<redis.client.StrictRedis object at 0x2dc4510>
ПРЕДУПРЕЖДЕНИЕ
Не все подключаемые клиенты поддерживают эту функцию.

 pools соединений
За кулисами django-redis использует базовую реализацию пула соединений redis-py и предоставляет простой способ его настройки. Кроме того, вы можете напрямую настроить создание соединения / пула соединений для бэкэнда.

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

Настроить pool соединений по умолчанию
Пул соединений по умолчанию прост. Например, вы можете настроить максимальное количество соединений в пуле, установив CONNECTION_POOL_KWARGS в CACHES настройке:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        # ...
        "OPTIONS": {
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
        }
    }
}

Вы можете проверить количество соединений, открытых пулом, с помощью следующего фрагмента:

from django_redis import get_redis_connection

r = get_redis_connection("default")  # Use the name you have defined for Redis in settings.CACHES
connection_pool = r.connection_pool
print("Created connections so far: %d" % connection_pool._created_connections)

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

CACHES = {
    "default": {
        # ...
        "OPTIONS": {
            "CONNECTION_POOL_KWARGS": {"max_connections": 100, "retry_on_timeout": True}
        }
    }
}

 Используйте свой собственный подкласс пула соединений
Иногда вы хотите использовать свой собственный подкласс пула соединений. Это возможно с помощью django-redis, используя CONNECTION_POOL_CLASS параметр в опциях серверной части.

MYPROJ / mypool.py

 Используйте свой собственный подкласс пула соединений
Иногда вы хотите использовать свой собственный подкласс пула соединений. Это возможно с помощью django-redis, используя CONNECTION_POOL_CLASSпараметр в опциях серверной части.

MYPROJ / mypool.py

settings.py

# Omitting all backend declaration boilerplate code.

"OPTIONS": {
    "CONNECTION_POOL_CLASS": "myproj.mypool.MyOwnPool",
}

Настройте фабрику соединений
Если ни один из предыдущих методов вас не устраивает, вы можете войти в процесс фабрики соединений django-redis и настроить или полностью переписать его.

По умолчанию django-redis создает соединения через django_redis.pool.ConnectionFactory класс, указанный в глобальном параметре Django DJANGO_REDIS_CONNECTION_FACTORY.

Частичный интерфейс ConnectionFactory класса

# Note: Using Python 3 notation for code documentation ;)

class ConnectionFactory(object):
    def get_connection_pool(self, params:dict):
        # Given connection parameters in the `params` argument,
        # return new connection pool.
        # It should be overwritten if you want do something
        # before/after creating the connection pool, or return your
        # own connection pool.
        pass

    def get_connection(self, params:dict):
        # Given connection parameters in the `params` argument,
        # return a new connection.
        # It should be overwritten if you want to do something
        # before/after creating a new connection.
        # The default implementation uses `get_connection_pool`
        # to obtain a pool and create a new connection in the
        # newly obtained pool.
        pass

    def get_or_create_connection_pool(self, params:dict):
        # This is a high layer on top of `get_connection_pool` for
        # implementing a cache of created connection pools.
        # It should be overwritten if you want change the default
        # behavior.
        pass

    def make_connection_params(self, url:str) -> dict:
        # The responsibility of this method is to convert basic connection
        # parameters and other settings to fully connection pool ready
        # connection parameters.
        pass

    def connect(self, url:str):
        # This is really a public API and entry point for this
        # factory class. This encapsulates the main logic of creating
        # the previously mentioned `params` using `make_connection_params`
        # and creating a new connection using the `get_connection` method.
        pass

Съемные парсеры
redis-py (клиент Python Redis, используемый django-redis ) поставляется с чистым парсером Python Redis, который очень хорошо работает для большинства распространенных задач, но если вы хотите повысить производительность, вы можете использовать hiredis .

hiredis - это клиент Redis, написанный на C, и у него есть собственный синтаксический анализатор, который можно использовать с django-redis .

"OPTIONS": {
    "PARSER_CLASS": "redis.connection.HiredisParser",
}

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

Клиент по умолчанию
Почти все о клиенте по умолчанию объясняется, за одним исключением: клиент по умолчанию поставляется с поддержкой master-slave.

Чтобы подключиться к настройке Redis Master-Slave, вы должны изменить что- LOCATION то вроде этого:

"LOCATION": [
    "redis://127.0.0.1:6379/1",
    "redis://127.0.0.1:6378/1",
]

Первая строка подключения представляет главный сервер, а остальные - подчиненные серверы.

ПРЕДУПРЕЖДЕНИЕ
Настройка Master-Slave не подвергается серьезным испытаниям в производственных средах.

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

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": [
            "redis://127.0.0.1:6379/1",
            "redis://127.0.0.1:6379/2",
        ],
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.ShardClient",
        }
    }
}
ПРЕДУПРЕЖДЕНИЕ
Клиент Shard все еще является экспериментальным, поэтому будьте осторожны при его использовании в производственных средах.

 

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

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

Пример настройки

 CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.HerdClient",
        }
    }
}

Этот клиент предоставляет дополнительные настройки:

  • CACHE_HERD_TIMEOUT: Установить время ожидания стада по умолчанию. (Значение по умолчанию: 60 с)

Сменный сериализатор
Подключаемые клиенты сериализуют данные перед отправкой на сервер. По умолчанию django_redis сериализует данные, используя Python pickle. Это очень гибкий и может обрабатывать широкий спектр типов объектов.

Для сериализации с использованием JSON вместо этого JSONSerializer также доступен сериализатор .

Пример настройки

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.json.JSONSerializer",
        }
    }
}

Также есть поддержка сериализации с использованием MsgPack http://msgpack.org/ (для этого требуется библиотека msgpack-python):

Пример настройки

 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.msgpack.MSGPackSerializer",
        }
    }
}

Подключаемый клиент Redis
django_redis redis.client.StrictClient по умолчанию использует клиент Redis . Можно использовать альтернативный клиент.

Вы можете настроить используемый клиент, установив его REDIS_CLIENT_CLASS в CACHES настройках. При желании вы можете предоставить аргументы этому классу, установив REDIS_CLIENT_KWARGS.

Пример настройки

CACHES = {
    "default": {
        "OPTIONS": {
            "REDIS_CLIENT_CLASS": "my.module.ClientClass",
            "REDIS_CLIENT_KWARGS": {"some_setting": True},
        }
    }
}

 

17 января 2019 г. 23:28 Теги - # Redis # django Категория - Django Kiwi standing on oval1176