RE:NODE

Базы данных11 мин чтения

Valkey или Redis: смена лицензии, форк и совместимость

Зачем появился Valkey, что изменилось в лицензии Redis, насколько они совместимы сегодня, какие клиенты работают с обоими и как перенести данные.

0 прочтений

Valkey - это открытый форк Redis, созданный под крылом Linux Foundation в марте 2024 года на основе Redis 7.2.4 после того, как Redis сменил лицензию. Для приложения это одно и то же: тот же протокол, те же команды, те же директивы конфигурации, тот же порт по умолчанию 6379 и те же клиентские библиотеки - ваш клиент Redis подключается к Valkey без изменений в коде. После форка они разошлись в возможностях, добавленных после 7.2, и в лицензировании, из-за которого форк и существует. Если вы используете Redis как кэш, хранилище сессий, очередь или ограничитель частоты запросов, на Valkey можно перейти, ничего не заметив. Если вы зависите от чего-то, что появилось в Redis после 7.2, например от модулей, вошедших в Redis 8, проверьте всё перед переездом.

Что произошло: смена лицензии#

Redis выпускался под трёхпунктовой лицензией BSD с 2009 года, и большую часть его жизни на этом история и заканчивалась. В 2018 году Redis Ltd перевела часть своих дополнительных модулей на более строгие лицензии, а ядро осталось под BSD. В марте 2024 года изменилось и ядро.

ДатаСобытие
2009Сальваторе Санфилиппо выпускает Redis под BSD-3-Clause
20 марта 2024Redis Ltd объявляет, что начиная с Redis 7.4 действует двойная лицензия RSALv2 и SSPLv1
28 марта 2024Linux Foundation объявляет о Valkey - форке Redis 7.2.4, который остаётся на BSD-3-Clause
Апрель 2024Valkey 7.2.5, первый релиз, прямая замена Redis 7.2
Сентябрь 2024Valkey 8.0, первый релиз с существенными собственными изменениями
31 марта 2025Valkey 8.1 с новой, более экономной по памяти хеш-таблицей
Май 2025Redis 8.0 добавляет AGPLv3 как третий вариант лицензии
21 октября 2025Valkey 9.0 со сроком жизни полей хешей и несколькими базами в режиме кластера

Обе лицензии 2024 года - Redis Source Available License v2 и Server Side Public License v1 - не являются одобренными лицензиями открытого ПО. На практике они запрещают предлагать Redis как управляемую услугу в конкуренции с Redis Ltd, а именно этим и занимались крупные облачные провайдеры. Ответом стал Valkey: мейнтейнеры, работавшие над Redis в этих компаниях, форкнули последний релиз под BSD, а среди первых, кто его поддержал, были Amazon Web Services, Google Cloud, Oracle, Ericsson и Snap.

Добавление AGPLv3 в 2025 году снова делает Redis 8 открытым ПО в обычном смысле слова. AGPL - копилефт-лицензия с сетевым условием: если вы изменяете сам Redis и даёте пользователям работать с ним по сети, вы обязаны предложить им свой изменённый исходный код. Для тех, кто использует Redis без изменений как компонент, это меняет очень немногое, но у многих компаний есть общие запреты на код под AGPL, а у форка к тому моменту была фора в год.

Что лицензии означают для тех, кто действительно пользуется этим ПО:

  • Запуск за собственным приложением - кэш, хранилище сессий, очередь - разрешён при любой лицензии, под которой когда-либо выходил Redis, включая RSALv2 и SSPLv1. Никто не просит вас платить за подключение к Redis.
  • Изменение сервера и запуск изменённой версии - тот случай, когда AGPLv3 просит опубликовать ваши изменения для пользователей этого сервиса. Использование без изменений ничего от вас не требует.
  • Продажа самого Redis как услуги - именно то, чему должны были помешать RSALv2 и SSPLv1, и причина, по которой провайдеры, занимающиеся этим, перешли на Valkey.
  • Распространение в составе дистрибутива Linux или продукта проще всего под BSD, поэтому дистрибутивы и предпочли форк.

Итак, для разработчика, который запускает один экземпляр за приложением, всё это лицензирование никак не влияет на то, что ему разрешено. Оно важно компаниям, строящим хостинговые сервисы, и дистрибутивам Linux, решающим, что поставлять. Fedora, например, заменила свой пакет Redis на Valkey.

Что такое Valkey#

Valkey - проект Linux Foundation с открытой моделью управления, техническим руководящим комитетом из представителей нескольких компаний и лицензией BSD-3-Clause, которую не может изменить один поставщик. Его исполняемые файлы называются valkey-server, valkey-cli, valkey-benchmark, valkey-check-aof и valkey-check-rdb, файл конфигурации - valkey.conf, а большинство пакетов также устанавливают совместимые имена, чтобы скрипты, вызывающие redis-cli, продолжали работать.

Проект не стоял на месте. Главные изменения после форка:

  • 8.0 переработал многопоточный ввод-вывод, чтобы один экземпляр мог использовать несколько ядер для работы с сетью, добавил двухканальную репликацию и метрики по слотам в режиме кластера.
  • 8.1 заменил основной словарь на хеш-таблицу, более эффективную по кэшу процессора и памяти, и сократил накладные расходы на ключ.
  • 9.0 добавил срок жизни отдельных полей хешей (HEXPIRE, HTTL и родственные команды), атомарную миграцию слотов в режиме кластера и нумерованные базы данных в режиме кластера.

Модули для JSON, фильтров Блума и поиска существуют как отдельные проекты Valkey (valkey-json, valkey-bloom, valkey-search) и распространяются вместе с сервером в виде комплекта, а не встроены в него.

Что такое Redis сейчас#

Redis 8 влил в основной дистрибутив то, что раньше было Redis Stack, - JSON-документы, движок запросов и поиска, временные ряды и вероятностные структуры вроде фильтров Блума - и добавил тип данных vector set. Если вы пользуетесь чем-то из этого, в Redis 8 это часть ядра, а в Valkey по умолчанию этого нет.

В Redis 7.4 также появился срок жизни полей хешей, который Valkey добавил в 9.0, а Redis 8 добавил вокруг него новые команды. Оба проекта продолжают добавлять команды, и пересечение после 7.2 частичное: некоторые возможности появились в обоих под одинаковыми именами, некоторые есть только в одном. Для всего, что новее 7.2, сверяйтесь со страницей документации команды для того сервера, который вы запускаете, а не предполагайте.

Совместимость на практике#

Что одинаково и останется одинаковым, потому что оба проекта считают это контрактом:

  • Протокол. RESP2 и RESP3, то же кадрирование, то же согласование через HELLO.
  • Все команды, существовавшие в Redis 7.2 - строки, хеши, списки, множества, сортированные множества, потоки, pub/sub, транзакции с MULTI и EXEC, скрипты на Lua через EVAL, функции через FCALL, ACL, CLIENT, CONFIG, INFO.
  • Конфигурация. valkey.conf принимает те же директивы, что и redis.conf, - maxmemory, maxmemory-policy, appendonly, save, requirepass и остальные.
  • Файлы сохранения. Valkey читает снимки RDB и append-only файлы, записанные Redis 7.2 и более ранними версиями.

Одна намеренная деталь помогает старым клиентам: вывод INFO server в Valkey по-прежнему содержит redis_version:7.2.4, а рядом - server_name:valkey и valkey_version с настоящей версией. Клиентские библиотеки, которые проверяют версию сервера перед использованием какой-то возможности, видят понятное им число.

bash
$ valkey-cli -h db.example.net -p 6379 --askpass INFO server | grep -E 'version|server_name'redis_version:7.2.4server_name:valkeyvalkey_version:8.1.1

Осторожность нужна с данными, записанными Redis 7.4 и новее. Их формат снимков может оказаться новее, чем умеет читать конкретный релиз Valkey, поэтому прежде чем загружать файл дампа Redis 7.4+, сверьтесь с примечаниями к релизу Valkey или переносите данные на уровне команд, как описано ниже.

Клиенты и библиотеки#

Лицензию клиентских библиотек никто не менял - это отдельные проекты, в основном под MIT, - и все они общаются с Valkey без изменений.

ЯзыкДавние клиенты RedisВарианты под брендом Valkey
Pythonredis-pyvalkey-py (форк), Valkey GLIDE
Node.jsioredis, node-redisiovalkey (форк ioredis), Valkey GLIDE
JavaJedis, Lettuce, Redissonvalkey-java, Valkey GLIDE
Gogo-redisvalkey-go, Valkey GLIDE
.NETStackExchange.Redis-
PHPphpredis, Predis-

Valkey GLIDE - собственный клиент проекта с общим ядром на Rust и привязками для нескольких языков. Для нового проекта это хороший выбор, для существующего - ненужная перемена. Фреймворки, работающие поверх этих клиентов, - Sidekiq, BullMQ, Celery, кэш-бэкенд Django, драйвер Redis в Laravel, Spring Data Redis - работают через нижележащий клиент, и им всё равно, какой сервер отвечает.

Строка подключения тоже та же: redis://:password@host:port/0 или rediss:// для TLS. Некоторые клиенты под брендом Valkey принимают и valkey://, но форма redis:// работает везде, и именно её ждут файлы конфигурации. Подключение и первые команды описаны в статье Valkey: первые шаги.

Переезд с Redis на Valkey#

Как переезжать, зависит от того, что это за данные.

Кэш. Не переносите его. Направьте приложение на новый сервер и дайте ему заполниться. Первые минуты придётся работать с холодным кэшем, так что делайте это вне часов пик, а если холодный кэш перегрузит вашу базу данных, сначала прочитайте раздел о лавине промахов в статье паттерны кэширования с Valkey.

Сессии и очереди. Обычно они достаточно короткоживущие, чтобы их не копировать, а дать им иссякнуть: перестаньте ставить задачи на старом сервере, дайте исполнителям закончить, переключитесь и смиритесь с тем, что пользователям с сессией на старом сервере придётся войти ещё раз.

Данные, которые нужно сохранить. С Redis 7.2 и более ранних версий самый чистый путь - реплика: запустите Valkey, выполните REPLICAOF old-host 6379 (с заданным masterauth, если у источника есть пароль), дождитесь окончания синхронизации, затем повысьте его командой REPLICAOF NO ONE и перенаправьте приложение. Если новый сервер не может достучаться до старого, копируйте ключ за ключом через SCAN, DUMP и RESTORE - так сохраняются типы и TTL:

copy_keys.py
import redissrc = redis.Redis(host="old-host", port=6379, password="old-pass")dst = redis.Redis(host="new-host", port=6379, password="new-pass")for key in src.scan_iter(count=1000):    payload = src.dump(key)    if payload is None:        continue                        # expired between SCAN and DUMP    ttl = src.pttl(key)    dst.restore(key, ttl if ttl > 0 else 0, payload, replace=True)

DUMP выдаёт данные в формате сериализации исходной версии, поэтому так можно переносить с Redis 7.2 и более ранних. С Redis 7.4 или 8 используйте инструмент, который читает значения обычными командами и записывает их заново, или пусть приложение само перестроит то, что ему нужно.

Перед переключением выполните на старом сервере INFO server и MODULE LIST. Модуль в этом списке - ReJSON, search, timeseries - это зависимость, которую нужно решить в первую очередь.

Производительность: что на самом деле отличается#

Бенчмарки, сравнивающие эти два сервера, в основном публикуют люди, заинтересованные в результате, и большинство из них измеряют большую машину, разогнанную до миллионов запросов в секунду. Несколько отличий реальны, и полезно знать, какие из них важны в масштабах, в которых работает большинство приложений.

Выполнение команд однопоточное в обоих. Каждая команда выполняется до конца, прежде чем начнётся следующая, и именно это делает INCR атомарным, а скрипты Lua безопасными без блокировок. Ни один проект этого не менял и не изменит, потому что на этом держится вся модель программирования. Распределять по потокам оба умеют сетевую работу вокруг команд: чтение запросов из сокетов, их разбор и запись ответов. Redis добавил многопоточный ввод-вывод в версии 6; Valkey 8 существенно его переработал, так что один экземпляр Valkey на нескольких ядрах обслуживает гораздо больше подключений и запросов, прежде чем основной поток станет пределом. В обоих это управляется директивой io-threads, и помогает это, только когда есть свободные ядра и много одновременных клиентов.

Память на ключ в Valkey 8.1 уменьшилась. Новая хеш-таблица хранит ключи с меньшими накладными расходами. Набор данных из нескольких больших значений этого не заметит; набор из миллионов мелких ключей - идентификаторов сессий, счётчиков ограничения частоты, записей кэша по несколько десятков байт - заметно лучше помещается в тот же объём памяти. На небольшом экземпляре, где пределом, в который вы на самом деле упираетесь, является память, это и есть улучшение, о котором стоит думать.

В малых масштабах всё решают сетевые обращения. Для приложения, которое отправляет несколько сотен команд в секунду, внутренняя скорость сервера не имеет значения: каждая команда стоит одного сетевого обращения туда и обратно, и время уходит именно туда. Конвейерная отправка нескольких команд за одно обращение, MGET вместо цикла из GET и открытые соединения в пуле дают для задержки больше, чем любой выбор между двумя серверами. valkey-benchmark (или redis-benchmark, который работает с обоими) измеряет, что выдают ваш собственный сервер и сеть, а это единственный бенчмарк, который к вам относится:

bash
$ valkey-benchmark -h db.example.net -p 6379 -a "$PASS" -t set,get -n 100000 -q$ valkey-benchmark -h db.example.net -p 6379 -a "$PASS" -t set,get -n 100000 -P 16 -q

Вторая строка отправляет конвейером по шестнадцать команд за обращение. Разница между двумя результатами обычно оказывается самым убедительным аргументом в пользу конвейеров, какой вы когда-либо увидите.

Что выбрать#

Для большинства приложений это не важно, и решает то, что предлагает ваша платформа. Выбирайте Valkey, если вам нужен сервер под BSD с управлением от нескольких поставщиков или если именно его предоставляет ваш дистрибутив или хостинг. Выбирайте Redis 8, если вам нужны его встроенные возможности для JSON, поиска, временных рядов или векторов в одном сервере и вас устраивает AGPL. В любом случае по возможности пишите код приложения под набор команд Redis 7.2, и он будет годами работать на обоих.

Обычно важнее вопрос не «какой», а нужен ли вам вообще хоть один из них - об этом статья Redis: когда он нужен, - и сколько памяти и какое сохранение данных нужно задаче.

Valkey на RE:NODE#

В линейке баз данных есть Valkey, а не Redis, и называется он так намеренно. Он говорит на протоколе Redis, так что любой клиент или библиотека Redis подключаются к нему без изменений. Каждый сервер защищён паролем со сгенерированными для него учётными данными и доступен по хосту и порту, указанным для тарифа; слота прокси нет, приложение подключается напрямую. Данные сохраняются на диск и через AOF, и снимками, так что перезапуск их не стирает. Тарифы начинаются с 256 МБ памяти и доходят до 4 ГБ. Статья какую базу данных выбрать ставит его рядом с линейками PostgreSQL, MySQL, MongoDB и SQL Server.

FAQ#

Является ли Valkey прямой заменой Redis?

Для Redis 7.2 и более ранних - да: тот же протокол, команды, конфигурация и форматы файлов. Приложения, использующие возможности, добавленные в Redis 7.4 или 8, - например, влитые модули JSON, поиска и временных рядов, - перед переключением нужно проверить команда за командой.

Нужно ли менять клиентскую библиотеку Redis?

Нет. redis-py, ioredis, node-redis, Jedis, Lettuce, go-redis, StackExchange.Redis и phpredis подключаются к Valkey как есть. Форки под брендом Valkey и клиент GLIDE существуют, но переходить на них не обязательно.

Redis снова открытый?

Начиная с Redis 8 в 2025 году Redis можно использовать под AGPLv3 - одобренной OSI лицензией открытого ПО - как альтернативой RSALv2 и SSPLv1. Redis 7.4 выходил только под двумя лицензиями source-available. Valkey всё это время оставался на BSD-3-Clause.

Почему Valkey сообщает redis_version 7.2.4?

Ради совместимости. Некоторые клиентские библиотеки проверяют версию сервера перед использованием какой-либо возможности, и им известны номера версий Redis. Valkey продолжает сообщать в этом поле версию, от которой он ответвился, а свою собственную версию сообщает отдельно как valkey_version.

Может ли Valkey прочитать мой файл dump.rdb от Redis?

Файлы, записанные Redis 7.2 и более ранними версиями, - да. Файлы от Redis 7.4 и новее могут использовать более новый формат; сверьтесь с примечаниями к релизу для вашей версии Valkey или переносите данные на уровне команд вместо копирования файла.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000