Redis

Материал из llmdocs — справочник разработчика
Портал: Базы данных
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]
  • Вытеснение. При достижении maxmemory Redis удаляет ключи по политике (например, allkeys-lru — давно не использованные), что и нужно для кэша.
  • Масштабирование. Репликация на реплики, Sentinel для автоматического переключения при отказе и Redis Cluster, распределяющий ключи по 16 384 слотам между узлами (см. Шардирование).[4]

Кэширование

Самый частый сценарий — кэш перед основной базой (cache-aside): приложение сначала ищет данные в Redis, при промахе читает из PostgreSQL и кладёт результат в кэш со сроком жизни. Главные вопросы — инвалидация (удалить ключ при изменении данных) и защита от лавины запросов при одновременном истечении популярного ключа (см. Кэш (вычисления)).

Ограничения

  • Объём данных ограничен оперативной памятью, которая дороже диска.
  • Гарантии сохранности слабее, чем у реляционных СУБД: Redis не стоит делать единственным хранилищем важных данных без понимания настроек сохранения.
  • Нет сложных запросов и соединений — модель данных нужно проектировать под конкретные операции.
  • По умолчанию сервер не защищён: его нельзя открывать в интернет без пароля, ACL и TLS.

Альтернативы и совместимые системы

Valkey — открытый форк, совместимый по протоколу; KeyDB и Dragonfly — многопоточные реализации совместимого протокола; Memcached — более простой кэш «ключ — строка». Облачные провайдеры предлагают управляемые сервисы на основе Redis или Valkey.

См. также

Источники

  1. Redis Documentation
  2. Redis — Data types
  3. Redis — Persistence
  4. Redis — Cluster specification
  5. Valkey
  6. antirez — Redis is open source again (2025)