Redis-py – работа с Redis

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

Redis — это высокопроизводительное хранилище данных в памяти, используемое как кэш, брокер сообщений, база данных или очередь. Он поддерживает разнообразные структуры данных: строки, списки, множества, хэши и другие. Для Python существует официальный клиент — redis-py, который предоставляет удобный интерфейс к функциональности Redis.

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

Установка и подключение

Установка библиотеки:

bash
pip install redis

Подключение к Redis (по умолчанию на порту 6379):

python
import redis client = redis.Redis(host='localhost', port=6379, db=0)

Проверка соединения:

python
client.ping() # Вернёт True при успешном соединении

Основы Redis и ключевые типы данных

Redis поддерживает:

  • Строки (set, get)

  • Списки (lpush, lrange)

  • Множества (sadd, smembers)

  • Хэши (hset, hget)

  • Упорядоченные множества (zadd, zrange)

Каждая структура данных имеет свои особенности и области применения.

Основные команды Redis через redis-py

Пример работы со строками

python
client.set("key", "value") value = client.get("key")

Списки

python
client.lpush("mylist", "one") client.lpush("mylist", "two") print(client.lrange("mylist", 0, -1))

Множества

python
client.sadd("tags", "python", "redis", "database") print(client.smembers("tags"))

Хэши

python
client.hset("user:1000", mapping={"name": "Иван", "age": "30"}) print(client.hgetall("user:1000"))

Работа с TTL и автоматическим удалением

python
client.set("temp_key", "value", ex=10) # Удалится через 10 секунд ttl = client.ttl("temp_key")

Можно продлить TTL:

python
client.expire("temp_key", 60)

Pub/Sub: подписка и публикация сообщений

Redis поддерживает обмен сообщениями между процессами:

python
# Публикация client.publish('news', 'новость дня') # Подписка pubsub = client.pubsub() pubsub.subscribe('news') for message in pubsub.listen(): print(message)

Паттерны применения Redis в Python-приложениях

  • Кэширование ответов API

  • Сессии пользователей

  • Очереди задач

  • Rate limiting

  • Pub/Sub для микросервисов

Работа с JSON и сериализацией данных

Redis работает со строками, поэтому нужно сериализовать сложные объекты:

python
import json client.set("user", json.dumps({"name": "Анна", "age": 25})) user = json.loads(client.get("user"))

Также возможно использовать pickle, но он менее безопасен.

Транзакции и пайплайны

Redis-пайплайны позволяют выполнять несколько команд за один запрос:

python
pipe = client.pipeline() pipe.set("key1", "value1") pipe.set("key2", "value2") pipe.execute()

Работа с многопоточностью и асинхронностью

Redis-py поддерживает многопоточную работу. Для асинхронных приложений используется библиотека aioredis или новая версия redis.asyncio:

python
import redis.asyncio as aioredis client = aioredis.Redis()

Мониторинг и отладка

  • client.info() — статистика сервера

  • client.dbsize() — количество ключей

  • client.flushdb() — очистка базы

Можно использовать командную строку redis-cli с командой MONITOR.

Интеграция с Flask, Django и FastAPI

Flask

python
from flask import Flask import redis app = Flask(__name__) cache = redis.Redis() @app.route('/') def index(): cache.incr("hits") return f"Хитов: {cache.get('hits').decode()}"

Django

В Django можно использовать Redis как backend для кэша или celery-брокера:

python
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", } }

FastAPI

С использованием BackgroundTasks или Depends можно реализовать кэширование или работу через redis.asyncio.

Безопасность и конфигурация

  • Устанавливайте пароль через конфигурацию Redis (requirepass)

  • Отключите неиспользуемые команды

  • Используйте только доверенные источники соединений

  • Настройте Redis Sentinel или кластер для отказоустойчивости

Тестирование с Redis-py

Для тестов можно:

  • Использовать отдельную базу (db=15)

  • Очищать базу после каждого теста: client.flushdb()

  • Применять mock Redis: fakeredis для unit-тестов

bash
pip install fakeredis

Сравнение с другими решениями

Инструмент Хранение Поддержка структур Скорость Асинхронность
Redis В памяти Да Очень высокая Да
Memcached В памяти Только строки Высокая Нет
SQLite На диске SQL таблицы Средняя Частично

Часто задаваемые вопросы (FAQ)

1. Что такое redis-py?
Это официальный клиент для взаимодействия с Redis из Python.

2. Поддерживает ли redis-py асинхронность?
Да, начиная с версии 4.2 через redis.asyncio.

3. Можно ли использовать Redis как кэш в Flask или Django?
Да, и это одна из самых популярных практик.

4. Подходит ли Redis для хранения пользовательских сессий?
Да, особенно когда важна скорость и масштабируемость.

5. Безопасно ли сериализовать данные через pickle?
Нет, лучше использовать JSON для безопасности.

6. Как очистить Redis перед тестом?
Вызовите client.flushdb() в начале или конце теста.

Полный справочник по работе с redis-py — клиентом Redis для Python

Установка

bash
pip install redis

Подключение к Redis

python
import redis r = redis.Redis(host='localhost', port=6379, db=0)

Для подключения с паролем:

python
r = redis.Redis(host='localhost', port=6379, password='yourpassword')

Основные операции (ключ-значение)

Метод Описание
set(key, value) Установить значение.
get(key) Получить значение.
delete(key) Удалить ключ.
exists(key) Проверить наличие ключа.
expire(key, seconds) Установить срок жизни.
ttl(key) Узнать TTL.
keys(pattern) Поиск ключей по шаблону.
python
r.set("name", "Alice") print(r.get("name")) # b'Alice' r.expire("name", 60) # 60 секунд

Работа с числами

python
r.incr("counter") # +1 r.decr("counter") # -1 r.incrby("counter", 5) # +5

Строки и байты

Redis хранит данные как байты. Для работы со строками:

python
value = r.get("key").decode() r.set("message", "Привет")

Работа со списками (list)

Метод Описание
lpush(list, value) Добавить в начало.
rpush(list, value) Добавить в конец.
lpop(list) Удалить и вернуть первый элемент.
rpop(list) Удалить и вернуть последний элемент.
lrange(list, start, end) Получить диапазон элементов.
python
r.rpush("queue", "task1") r.lpush("queue", "task0") r.lrange("queue", 0, -1)

Множества (set)

Метод Описание
sadd(set, value) Добавить элемент.
srem(set, value) Удалить элемент.
smembers(set) Все элементы.
sismember(set, value) Проверка принадлежности.
python
r.sadd("tags", "python") r.sismember("tags", "python") # True

Хеши (hash)

Метод Описание
hset(name, key, value) Установить поле.
hget(name, key) Получить значение поля.
hgetall(name) Все поля и значения.
python
r.hset("user:1", "name", "Alice") r.hget("user:1", "name") # b'Alice'

Упорядоченные множества (sorted set)

Метод Описание
zadd(set, {value: score}) Добавить элемент с приоритетом.
zrange(set, start, stop) Получить элементы.
zrangebyscore(set, min, max) Поиск по рейтингу.
python
r.zadd("leaderboard", {"bob": 100, "alice": 200}) r.zrange("leaderboard", 0, -1, withscores=True)

Pub/Sub (публикация и подписка)

Подписчик:

python
pubsub = r.pubsub() pubsub.subscribe("news") for message in pubsub.listen(): print(message)

Публикатор:

python
r.publish("news", "Breaking news!")

Пайплайны (batch-команды)

python
pipe = r.pipeline() pipe.set("a", 1) pipe.set("b", 2) pipe.execute()

Кеширование с TTL

python
r.setex("temp_key", 60, "временное значение") # 60 сек