Redis — это простой, мощный и чертовски быстрый инструмент для кэширования данных. Хранение данных в оперативной памяти обеспечивает близкую к молниеносной скорость доступа. Сегодня мы научимся:
- Устанавливать Redis на локальной машине.
- Настраивать FastAPI для работы с Redis.
- Выполнять базовые операции через Redis и FastAPI: добавлять данные, читать их и удалять.
Погнали!
Установка Redis
На Windows
Установка Redis на Windows стала чуточку хитрее, так как официально Redis ориентирован на Linux. Но есть обходной путь:
- Зайдите на https://github.com/microsoftarchive/redis/releases.
- Скачайте
redis-x64-{version}.zip. - Распакуйте архив в удобное вам место.
- Зайдите в папку, откройте терминал и запустите сервер:
redis-server.exe
Теперь Redis работает на вашем компьютере. Вы можете проверить его работу, запустив другой терминал и набрав:
redis-cli
Попробуйте команду:
PING
Должен появиться ответ PONG. Это Redis говорит: "Привет, я здесь!".
На Linux
Сначала обновите список репозиториев:
sudo apt update
Установите Redis:
sudo apt install redis
Запустите Redis:
sudo systemctl start redis
Проверьте его статус:
sudo systemctl status redis
И, конечно, введите redis-cli и попробуйте команду PING, чтобы убедиться, что всё работает.
Подключение к FastAPI
Теперь, когда Redis установлен, давайте подключим его к нашему приложению FastAPI с помощью Python-библиотеки redis-py. Эта библиотека позволяет нам взаимодействовать с Redis из FastAPI легко и удобно.
Для начала установим redis-py:
pip install redis
Если вы планируете использовать асинхронные операции, рекомендую установить aioredis:
pip install aioredis
Добавим базовое подключение Redis в наше приложение FastAPI. Вот простой пример:
from fastapi import FastAPI
import redis
app = FastAPI()
# Создаем подключение к Redis
redis_client = redis.StrictRedis(host="localhost", port=6379, decode_responses=True)
@app.get("/")
def read_root():
# Записываем значение в Redis
redis_client.set("hello", "world")
# Читаем значение из Redis
value = redis_client.get("hello")
return {"Redis says": value}
Заметка:
host="localhost"указывает, что сервер Redis работает локально.port=6379— стандартный порт Redis.decode_responses=Trueпозволяет работать с данными в виде строк, а не байтов.
Асинхронное подключение с aioredis
Если вы используете асинхронные операции в FastAPI, то aioredis — ваш лучший друг:
from fastapi import FastAPI
import aioredis
app = FastAPI()
# Указываем URL подключения к Redis
REDIS_URL = "redis://localhost"
@app.on_event("startup")
async def startup_event():
# Подключаемся к Redis при запуске приложения
app.state.redis = await aioredis.from_url(REDIS_URL, decode_responses=True)
@app.on_event("shutdown")
async def shutdown_event():
# Закрываем подключение к Redis при завершении работы приложения
await app.state.redis.close()
@app.get("/")
async def read_root():
redis = app.state.redis
# Асинхронно записываем данные в Redis
await redis.set("hello", "world")
# Асинхронно читаем данные из Redis
value = await redis.get("hello")
return {"Redis says": value}
Что тут нового? Мы используем декораторы @on_event для управления жизненным циклом нашего приложения:
- startup_event: подключаемся к Redis при запуске.
- shutdown_event: закрываем соединение при завершении.
Первое взаимодействие с Redis
Теперь давайте попробуем выполнить несколько операций с помощью нашей библиотеки. Мы уже видели, как добавлять и получать данные. Давайте углубимся чуть больше.
Запись данных в Redis
redis_client.set("key", "value")
Чтение данных из Redis
value = redis_client.get("key")
print(value) # "value"
Удаление данных
redis_client.delete("key")
Счетчики и инкременты.
Redis поддерживает встроенные числовые операции:
redis_client.set("counter", 1)
redis_client.incr("counter") # Увеличивает значение на 1
print(redis_client.get("counter")) # 2
Пример с FastAPI
Допустим, вы хотите создать простое API для работы с ключами-значениями:
@app.post("/set/{key}/{value}")
async def set_value(key: str, value: str):
redis = app.state.redis
await redis.set(key, value)
return {"message": f"Key '{key}' set to '{value}'"}
@app.get("/get/{key}")
async def get_value(key: str):
redis = app.state.redis
value = await redis.get(key)
if value is None:
return {"error": f"Key '{key}' not found"}
return {"value": value}
Попробуйте отправить POST-запрос на /set/test/123 и затем выполните GET-запрос на /get/test. Вы должны получить "123".
Типичные ошибки и подводные камни
Работа с Redis выглядит просто, но есть несколько вещей, которые могут вызвать проблемы:
- Не работает Redis-сервер. Убедитесь, что сервер Redis запущен. Проверьте это командой:
Ответredis-cli pingPONGговорит, что сервер работает. - Ошибка подключения. Убедитесь, что вы указали правильный
hostиport. Например, если Redis запущен в Docker, хостом может быть127.0.0.1или даже имя контейнера. - TTL и устаревшие данные. Если вы используете
expireилиsetex, данные могут неожиданно исчезать. Убедитесь, что для критически важных данных TTL не используется.
Применение в реальных проектах
Подключение Redis к FastAPI открывает множество возможностей:
- Кэширование ответов API.
- Хранение сессий пользователей.
- Реализация счетчиков и ограничений по частоте запросов (rate limiting).
- Хранение временных данных, таких как токены для подтверждения email.
Redis часто используется в высоконагруженных системах. Например, популярные платформы, такие как Twitter и GitHub, применяют Redis для кэширования и управления очередями.
Теперь у вас есть базовые навыки для установки Redis и подключения его к FastAPI. В следующей лекции мы рассмотрим, как настроить кэширование для запросов к базе данных через Redis, что сделает ваше приложение ещё быстрее.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ