Redis
| Полное название | Remote Dictionary Server |
|---|---|
| Автор | Сальваторе Санфилиппо (antirez) |
| Первый выпуск | 2009 |
| Язык | C |
| Модель | ключ-значение со структурами данных, в памяти |
| Лицензия | с 2024 — RSALv2/SSPLv1, с Redis 8 (2025) также AGPLv3 |
| Форк | Valkey (Linux Foundation, 2024, лицензия BSD) |
| Порт по умолчанию | 6379 |
Redis (от Remote Dictionary Server) — хранилище данных, которое держит всё в оперативной памяти и поэтому отвечает за доли миллисекунды. В отличие от простых кэшей «ключ — строка», Redis хранит под ключами структуры данных — списки, хеши, множества, сортированные множества, потоки — и выполняет над ними атомарные операции на сервере. Это делает его универсальным инструментом: кэш, хранилище сессий, счётчики и ограничители частоты запросов, очереди задач, рейтинги, публикация и подписка.[1]
Redis — одна из самых популярных баз данных; его применяют почти в любом крупном веб-сервисе рядом с основной реляционной базой.
История
Итальянский программист Сальваторе Санфилиппо (antirez) начал писать Redis в 2009 году, чтобы ускорить свой сервис веб-аналитики, которому не хватало скорости MySQL. Проект быстро стал популярным; с 2015 года его развитие спонсировала компания Redis Labs (ныне Redis Ltd.). В 2020 году Санфилиппо отошёл от проекта, а в конце 2024 года вернулся.
В марте 2024 года Redis Ltd. сменила открытую лицензию BSD на RSALv2 и SSPLv1, запрещающие облачным провайдерам предлагать Redis как сервис без договорённости. В ответ Linux Foundation при поддержке AWS, Google и других компаний создала открытый форк Valkey на основе последней BSD-версии.[5] В 2025 году с выходом Redis 8 компания добавила открытую лицензию AGPLv3.[6]
Структуры данных
| Тип | Описание | Примеры применения |
|---|---|---|
| String | строка или число до 512 МБ | кэш, счётчики (INCR), флаги |
| Hash | словарь полей | объекты: профиль пользователя |
| List | связный список | очереди задач, последние события |
| Set | множество уникальных значений | теги, уникальные посетители |
| Sorted Set | множество с числовыми оценками, упорядоченное | рейтинги, приоритетные очереди, временные окна |
| Stream | журнал записей с группами потребителей | очереди сообщений, события |
| Bitmap, HyperLogLog | биты; приближённый подсчёт уникальных | активность по дням, подсчёт миллионов уникальных |
| Geo | координаты | «ближайшие точки» |
Помимо этого есть публикация/подписка (Pub/Sub), транзакции MULTI/EXEC, скрипты на Lua и функции, а в новых версиях — поиск, JSON и векторные множества для векторного поиска.[2]
Примеры
redis-cli
SET page:/home "<html>..." EX 60 # кэш на 60 секунд
GET page:/home
INCR views:article:42 # атомарный счётчик
HSET user:42 name "Алиса" plan "pro" # хеш
ZADD leaderboard 1500 alice 1200 bob # рейтинг
ZREVRANGE leaderboard 0 9 WITHSCORES # топ-10
LPUSH jobs '{"type":"email","to":42}' # очередь задач
BRPOP jobs 0 # обработчик ждёт задачу
Ограничитель частоты запросов на Python — классический пример:
import redis
r = redis.Redis()
def allow(user_id: int, limit: int = 100) -> bool:
key = f"rate:{user_id}"
count = r.incr(key)
if count == 1:
r.expire(key, 60) # окно в одну минуту
return count <= limit
Как устроен
- Однопоточное выполнение команд. Команды выполняются по одной в основном потоке, поэтому каждая атомарна, а гонки между командами невозможны. Сетевой ввод-вывод может обрабатываться дополнительными потоками. Следствие: медленная команда (
KEYS *на миллионах ключей) блокирует всех — вместо неё используютSCAN. - Сохранение на диск. RDB — периодические снимки, AOF — журнал всех команд записи; их можно сочетать. При отказе возможно потерять данные за последнюю секунду или интервал снимка.[3]
- Вытеснение. При достижении
maxmemoryRedis удаляет ключи по политике (например,allkeys-lru— давно не использованные), что и нужно для кэша. - Масштабирование. Репликация на реплики, Sentinel для автоматического переключения при отказе и Redis Cluster, распределяющий ключи по 16 384 слотам между узлами (см. Шардирование).[4]
Кэширование
Самый частый сценарий — кэш перед основной базой (cache-aside): приложение сначала ищет данные в Redis, при промахе читает из PostgreSQL и кладёт результат в кэш со сроком жизни. Главные вопросы — инвалидация (удалить ключ при изменении данных) и защита от лавины запросов при одновременном истечении популярного ключа (см. Кэш (вычисления)).
Ограничения
- Объём данных ограничен оперативной памятью, которая дороже диска.
- Гарантии сохранности слабее, чем у реляционных СУБД: Redis не стоит делать единственным хранилищем важных данных без понимания настроек сохранения.
- Нет сложных запросов и соединений — модель данных нужно проектировать под конкретные операции.
- По умолчанию сервер не защищён: его нельзя открывать в интернет без пароля, ACL и TLS.
Альтернативы и совместимые системы
Valkey — открытый форк, совместимый по протоколу; KeyDB и Dragonfly — многопоточные реализации совместимого протокола; Memcached — более простой кэш «ключ — строка». Облачные провайдеры предлагают управляемые сервисы на основе Redis или Valkey.