Redis — ключ-значение хранилище¶
Redis (Remote Dictionary Server) — это свободное программное обеспечение, работающее как хранилище ключ-значение в памяти с открытым исходным кодом, написанное на языке C. Redis поддерживает структуры данных, такие как строки, списки, хеш-таблицы, множества и сортированные множества, и может использоваться как база данных, кэш и брокер сообщений. Проект был создан Сальваторе Санфилиппо (Salvatore Sanfilippo) в 2009 году и с тех пор стал одним из самых распространённых NoSQL-решений в мире.
¶История
Проект Redis был начат в 2009 году итальянским программистом Сальваторе Санфилиппо, известным под ником antirez. Первоначально Redis был разработан как решение для улучшения скорости обработки запросов в веб-сервисе, который Санфилиппо вёл в то время. Проект быстро набрал популярность благодаря своей простоте и высокой производительности.
В 2015 году был создан Redis Labs (с 2020 года — Redis Ltd.), компания, которая занимается развитием и поддержкой Redis, предлагая коммерческие версии и облачные сервисы. В 2024 году Redis Labs изменила лицензию Redis с BSD на более ограничительные RSALv2 и SSPLv1, что вызвало волну критики в сообществе и привело к появлению форков, таких как Valkey (развиваемый Linux Foundation) и Dragonfly.
¶Характеристики
Redis работает в оперативной памяти, что обеспечивает очень высокую скорость операций чтения и записи — часто на уровне микросекунд. Основные характеристики:
- Структуры данных: строки, списки, хеш-таблицы, множества, сортированные множества, битовые карты, потоки данных (streams), пространственные индексы (geospatial).
- Атомарность операций: многие операции выполняются атомарно, что упрощает конкурентный доступ.
- Персистентность: Redis поддерживает два механизма сохранения данных — RDB (снимки состояния) и AOF (журнал операций записи).
- Репликация: поддерживается мастер-реплика с асинхронной репликацией.
- Кластеризация: Redis Cluster обеспечивает горизонтальное масштабирование с автоматическим шардированием.
- Pub/Sub: встроенная поддержка публикации-подписки для обмена сообщениями.
- Транзакции: MULTI/EXEC позволяет выполнять набор команд атомарно.
¶Архитектура
Redis использует однопоточную модель обработки команд (хотя начиная с версии 6.0 введена многопоточность для ввода-вывода). Такой подход упрощает конкурентный доступ и позволяет избежать блокировок. Сервер слушает TCP-порт 6379 по умолчанию и обрабатывает команды в текстовом протоколе RESP (REdis Serialization Protocol).
¶Применение
Redis широко используется в различных областях:
- Кэширование: хранение часто запрашиваемых данных для снижения нагрузки на основную базу данных.
- Сессии: хранение пользовательских сессий в веб-приложениях.
- Очереди задач: реализация очередей обработки с помощью списков.
- Лидерборды: сортированные множества удобны для хранения рейтингов.
- Реалтайм-аналитика: подсчёт счётчиков и метрик в реальном времени.
- Геопространственные данные: индексы для поиска по местоположению.
¶Ограничения
Поскольку Redis хранит данные в оперативной памяти, объём хранимых данных ограничен размером RAM. Для больших объёмов данных рекомендуется использовать Redis Cluster или внешние системы хранения. Также при падении процесса без включённой персистентности данные могут быть потеряны.
¶Влияние
Redis стал одним из самых популярных NoSQL-решений и входит в технологический стек множества крупных компаний. Он является частью стандартного набора инструментов DevOps и входит в состав многих PaaS-платформ. Активное сообщество разработчиков и обширная экосистема клиентских библиотек для различных языков программирования делают Redis универсальным инструментом для работы с данными в памяти.
Источники:
- Официальная документация Redis (redis.io)
- Книга «Redis in Action» Джозефа Нельсона
- Статьи Сальваторе Санфилиппо на блоге Redis
- Обзоры NoSQL-систем в технической литературе
