Руководство для начинающих по Redis с Python

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

Что такое Редис?

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

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

Ключевые особенности и преимущества Redis в приложениях Python

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

Доступность данных гарантируется даже после перезапуска сервера благодаря способности Redis сохранять данные. Избыточность данных и отказоустойчивость обеспечиваются встроенной репликацией. Эффективная связь между компонентами приложения становится возможной благодаря обмену сообщениями pub/sub.

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

Почему использование Redis в Python выгодно?

Планка для приложений Python поднимается благодаря многочисленным преимуществам благодаря интеграции Redis с Python. Для достижения низкой задержки и быстрого времени отклика используется сочетание эффективной структуры Redis и хранилища данных в памяти. Масштабируемость Redis обеспечивает плавное расширение с помощью репликации «главный-подчиненный» и распределения данных по многочисленным узлам по мере расширения базы пользователей.

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

Установка и настройка Redis для Python

Процесс установки Redis

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

Поскольку для написания этой статьи я буду использовать Mac, вы можете установить Redis на свой Mac, если у вас установлен Homebrew, введя приведенную ниже команду в своем терминале.

brew install redis

Установка Redis на Mac

Как установить Redis-py, клиентскую библиотеку Python Redis

Используя pip, менеджер пакетов Python, вы можете установить клиентскую библиотеку Redis-py после установки Redis:

pip install redis

Менеджер пакетов по умолчанию для Python называется Pip ; Я включу ссылку на сайт, если вы хотите узнать больше.

Настройка сервера Redis и подключение из Python

В Windows вы можете просто запустить файл red-server.exe, который будет расположен в папке установки, используя командную строку или PowerShell.

Если вы используете Mac или Linux, вы можете использовать приведенную ниже команду на своем терминале.

redis-server

Работающий сервер Redis

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

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

import redis

redis_client = redis.Redis(host='localhost', port=6379, db=0)

redis_client.set('key', 'value')
data = redis_client.get('key')
print(data)

Соединение Redis с Python

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

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

Основы Redis

Давайте сначала разберемся с некоторыми основами использования Redis.

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

Фундаментальные структуры данных

Строки

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

Списки

Набор компонентов в упорядоченной коллекции, где разрешены дубликаты. Поддерживает различные операции, такие как push, pop, получение диапазона и т. д. Идеально подходит для создания каналов активности, брокеров сообщений и очередей.

Наборы

Группа отдельных, неорганизованных компонентов. Поддерживает такие операции над множествами, как пересечение, различие и объединение. Идеально подходит для использования тегов, связей в социальном графе и членства в событиях.

Сортированные наборы

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

Хэши

Хранилище ключей и значений, в котором ключи соответствуют различным полям и соответствующим им значениям. Идеально подходит для хранения и поиска сложных объектов. Управляемые профили пользователей, настройки и многое другое.

Примеры кода Python для демонстрации каждой структуры данных

Строки

import redis

redis_client = redis.Redis()

redis_client.set("name", "John")
redis_client.set("Age", '15')

name = redis_client.get("name")
age = redis_client.get("Age")
print(name.decode()) 
print(age.decode())

В приведенном выше коде мы видим, как использовать строки.

Сначала я импортировал Redis, затем создал соединение с клиентом Redis, а затем в строках 5 и 6 использовал метод set() для создания двух строк.

Затем, чтобы получить данные, я использовал функцию get() в строках 8 и 9, сохраняя значения в переменных «имя» и «возраст», и, наконец, используя метод decode() в строках 10 и 11, я просто распечатал числа, хранящиеся в переменной.

Результат виден на рисунке ниже.

Строка Redis

Строка Redis

Списки

import redis

redis_client = redis.Redis()

redis_client.lpush("nums", 1)
redis_client.lpush("nums", 2)
redis_client.lpush("nums", 3)

numbers = redis_client.lrange("nums", 0, -1)
print(numbers) 

Код выше демонстрирует, как использовать списки.

Чтобы добавить элементы в список, я сначала импортировал Redis, затем подключился к клиенту Redis, а затем в строках 5, 6 и 7 использовал метод lpush(), который принимает аргументы «имя списка» и «элемент».».

Наконец, я использую метод lrange() для отображения списка путем получения данных из переменной.

Списки Redis

Списки Redis

Наборы

import redis

redis_client = redis.Redis()

redis_client.sadd("fruits", "apple")
redis_client.sadd("fruits", "banana")
redis_client.sadd("fruits", "orange")

fruits = redis_client.smembers("fruits")
print(fruits)

Мы можем увидеть, как использовать наборы в приведенном выше коде.

После импорта Redis и установления соединения с клиентом Redis строки с 5 по 7 реализуют метод sadd(), который добавляет элементы в набор.

Наконец, чтобы распечатать список, я использую метод smembers(), чтобы получить значения переменной и распечатать их.

Наборы Redis

Наборы Redis

Хэши

import redis

redis_client = redis.Redis()

redis_client.hset("user:1", "name", "Alice")
redis_client.hset("user:1", "age", 30)

user_data = redis_client.hgetall("user:1")
print(user_data)

Мы можем увидеть, как использовать хэши в приведенном выше коде.

Сначала я импортировал Redis, после чего установил соединение с клиентом Redis. Я использовал метод hset() в строках 5 и 6, который добавляет элементы в хеш.

Затем я использовал метод hgetall() для сохранения хеш-таблицы в переменной перед печатью значений.

Хэши Redis

Хэши Redis

Ключи и команды Redis

Основной метод хранения и извлечения данных Redis заключается в использовании ключей. Для взаимодействия с этими ключами, которые связаны с разными значениями, Redis предоставляет широкий спектр команд.

Чтобы использовать Python для выполнения операций CRUD с ключами Redis, в этом разделе мы рассмотрим несколько важных команд Redis и их эквивалентов Python.

Важность ключей в Redis

Для хранения данных ключи служат отличительными идентификаторами в Redis. Эти ключи могут хранить любые двоичные данные и быть двоично безопасными. Каждый ключ имеет уникальное значение, которое может быть простой строкой или одной из многих структур данных, предоставляемых Redis, таких как списки, наборы, хэши или отсортированные наборы.

Redis предоставляет значимые ключи, которые используются для управления данными и позволяют разработчикам быстро организовывать данные. Приложения Python могут легко обеспечить высокопроизводительное хранение и извлечение данных, используя надежную парадигму «ключ-значение» Redis и разнообразие форматов данных.

Пример операций CRUD с ключами Redis в Python

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

В этом примере я буду выполнять операции CRUD (создание, чтение, обновление, удаление) с ключами Redis:

import redis

redis_client = redis.Redis()

redis_client.set("username", "john_doe")

username = redis_client.get("username")
print(username.decode())

redis_client.set("email", "[email protected]", nx=True)

redis_client.setex("password_reset_token", 600, "a1b2c3d4e5")

redis_client.delete("username")

key_exists = redis_client.exists("email")
print(key_exists)

В приведенном выше коде сначала импортируется библиотека Redis, что позволяет нам использовать клиент Python Redis-py. Затем клиент Redis создается с помощью redis.Redis().

Это устанавливает соединение с локальным сервером Redis, который прослушивает порт 6379 на хосте по умолчанию, localhost. Вы можете предоставить эти значения в качестве аргументов функции redis.Redis(), если ваш сервер Redis работает на другом хосте или порту. Мы присваиваем значение «john_doe» новому ключу с именем «username» с помощью redis_client.set().

Redis — это место, где хранится эта пара ключ-значение. Имя пользователя теперь представлено ключом «имя пользователя». Чтобы получить значение ключа «имя пользователя», мы используем redis_client.get(). Это возвращает значение «john_doe», которое мы декодируем с помощью decode(), поскольку Redis-py возвращает значения в байтах.

Redis_client.set() используется для добавления значения «[email protected]» к новому ключу «email». Ключ устанавливается только в том случае, если он еще не существует благодаря опции nx=True. Ключ не будет обновлен, если он уже существует. Мы генерируем новый ключ под названием «password_reset_token» со значением «a1b2c3d4e5» с помощью redis_client.setex(). Кроме того, мы дали этому ключу срок действия 600 секунд (10 минут). Ключ будет автоматически удален из Redis через десять минут.

Мы используем redis_client.delete() для удаления ключа. Это удалит из Redis комбинацию «ключ-значение», связанную с ключом «имя пользователя». Используя redis_client.exists(), мы можем определить, присутствует ли ключ. Он возвращает 1, что соответствует истине, если присутствует ключ «электронная почта», и 0, что является ложью в противном случае.

Демонстрация ключей Redis

Операции CRUD с использованием ключей Redis

Транзакции и конвейеры Redis в Python

Необходимость транзакции в определенных операциях Redis

Транзакции Redis необходимы для обеспечения атомарности набора операций. Атомарность гарантирует, что либо каждая операция в транзакции будет успешной одновременно, либо ни одна из них не будет успешной вообще. Это важно для сохранения целостности и согласованности данных, особенно при управлении жизненно важными процессами, в которых задействовано множество команд Redis. Например, перевод денег между счетами в банковском приложении требует сочетания списания с одного счета и зачисления на другой, что должно либо происходить полностью, либо не происходить вообще.

Как использовать транзакции и конвейеры в Redis-py для обеспечения атомарности

Транзакции с использованием команд MULTI, EXEC и WATCH поддерживаются Redis-py. Используя метод конвейера, который генерирует объект конвейера для пакетного выполнения, вы можете запускать несколько команд Redis как одну транзакцию.

Redis обеспечивает атомарное выполнение команд, заключая их в блок конвейера.

Давайте воспользуемся иллюстрацией, чтобы продемонстрировать, как это работает.

import redis

redis_client = redis.Redis()

with redis_client.pipeline() as pipe:
  while True:
    try:
      pipe.watch('key1', 'key2', 'key3')
      pipe.multi()

      # Perform multiple Redis operations within the transaction
      pipe.set('key1', 'value1')
      pipe.set('key2', 'value2')
      pipe.set('key3', 'value3')

      pipe.execute()
      break

    except redis.WatchError:
      continue

В этом коде мы начинаем с использования Redis для создания клиента Redis.Redis(). Затем оператор with используется для создания объекта для конвейера, называемого каналом. Мы можем организовать несколько команд для атомарного выполнения с помощью конвейера. Мы пытаемся выполнить транзакцию, используя инструкции Redis внутри цикла while True. Для обработки экземпляров, связанных с параллелизмом, необходим цикл.

Мы начинаем транзакцию с «наблюдения» за ключами «key1», «key2» и «key3» в вызове Pipe.watch(). Техника наблюдения гарантирует, что никакие другие клиенты во время транзакции не смогут изменить эти ключи. Транзакция прерывается, если один клиент изменяет любой из этих ключей.

Транзакция начинается с использования метода Pipe.multi(). В этом примере мы присваиваем ключам «key1», «key2» и «key3» соответствующие значения «value1», «value2» и «value3».

Любая команда Redis, необходимая вашему приложению, может быть выполнена на протяжении всей транзакции. Метод выполнения теперь использует Pipe.execute() для атомарного выполнения каждой команды в конвейере. Redis выдает ошибку WatchError всякий раз, когда какая-либо команда завершается неудачей, указывая на то, что один из наблюдаемых ключей был изменен во время транзакции.

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

Демпфирование конвейера транзакций Redis

Пример конвейера транзакций Redis на Python

Преимущества пакетной обработки команд с использованием конвейеров в Python

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

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

Кэширование с помощью Redis в Python

Преимущества использования Redis в качестве кэша в приложениях Python

Превосходным вариантом кэширования для приложений Python с функциональностью в памяти и высокой производительностью является Redis. Чтобы избежать необходимости получать часто используемые данные из первичных источников данных, таких как базы данных или API, кэширование влечет за собой их хранение в Redis.

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

Кэширование и его преимущества

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

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

Реализация кэширования с использованием Redis-py

Реализация кэширования Redis-py в Python — простая процедура. Создайте клиент Redis, используя Redis, для первого подключения к серверу Redis. Redis(). Используйте redis_client, чтобы проверить, присутствуют ли данные уже в кеше Redis, прежде чем запрашивать их из основного source.get(key).

Если информация отсутствует, получите ее из основного источника и используйте redis_client, чтобы сохранить ее в Redis. Чтобы контролировать достоверность кэша, используйте функцию set(key, value, expiry_time) с необязательным сроком действия. Получайте данные для предстоящих запросов из кэша Redis, а не из основного источника, чтобы значительно сократить время ответа и снизить нагрузку на основной источник данных, улучшая извлечение данных и производительность приложения.

Реальные примеры использования

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

Чтобы остановить злоупотребления и сохранить стабильность системы, еще одним важным приложением является ограничение скорости, поскольку Redis устанавливает ограничения скорости API. Для связи в реальном времени между компонентами распределенной системы Redis также предлагает обмен сообщениями Pub/Sub. Таблицы лидеров, очереди заданий, хранилище геопространственных данных, кэширование запросов к базе данных и кэширование моделей машинного обучения — это различные области, которые показывают адаптивность и важность Redis в нескольких отраслях.

Краткое содержание

Итак, мы, наконец, подошли к концу этого интенсивного пути изучения использования Redis с Python. Мы рассмотрели все теоретические моменты и разобрались в различных концепциях.

С помощью простых примеров кода мы получили практические знания и вместе с этим разобрались в теории. Наконец, мы рассмотрели некоторые ключевые и жизненно важные элементы, которые используются при использовании Redis с Python.

Рекомендации

Официальная документация Redis

Руководство по установке Redis