Аналоги Redis: Valkey, Dragonfly, KeyDB, Garnet и Memcached

↑ 4.1 Redis и MongoDB · ← Предыдущая

Желательно~7 мин чтенияУровень: middle

Зачем это на собесе

«Redis сменил лицензию, чем его заменить?» и «Redis или Memcached?» Ответ должен показывать, что вы отличаете протокол от реализации: приложение говорит по RESP и обычно не замечает подмены сервера, а вот расширенные модули, персистентность и кластер ведут себя по-разному.

Подтемы

  • Почему появились форки и альтернативы
  • Valkey, Dragonfly, KeyDB, Garnet
  • Memcached: когда достаточно простого кэша
  • Совместимость и что проверить перед заменой

Объяснение

Что случилось с лицензией Redis

До 2024 года Redis распространялся под свободной лицензией BSD. В марте 2024 компания Redis сменила лицензию на двойную RSALv2/SSPLv1, которые не считаются открытыми по определению OSI и ограничивают облачные сервисы. В ответ Linux Foundation объявил форк Valkey на основе Redis 7.2.4 под лицензией BSD, его поддержали AWS, Google Cloud, Oracle и другие. В 2025 году Redis добавил лицензию AGPLv3 как третий вариант для версии 8. Для вас как разработчика это значит: протокол остался тем же, а выбор сервера стал вопросом лицензии, поддержки и возможностей.

Протокол общий

Клиенты говорят с сервером по протоколу RESP (текстовый протокол, см. пример ручного запроса). Поэтому StackExchange.Redis и другие клиенты работают с совместимыми серверами без изменений кода, меняется только адрес.

Сравнение

РешениеКто делает, лицензияОсобенностьНа что смотреть
RedisRedis Ltd, RSALv2/SSPLv1/AGPLv3 (8.x)эталон, модули (JSON, поиск, time series), самое широкое сообществолицензия, часть возможностей в коммерческих редакциях
ValkeyLinux Foundation, BSDфорк Redis, drop-in замена, поддержка крупных облаков, улучшения многопоточного ввода-выводамодули Redis не все доступны; дорожные карты расходятся с Redis
DragonflyDragonfly, BSLмногопоточная архитектура «ничего общего», высокая производительность на одном узле, меньше потребление памятилицензия BSL, не все команды и сценарии кластера совместимы
KeyDBSnap, BSDфорк с многопоточностью, активно-активная репликацияразвитие заметно медленнее, проверяйте актуальность проекта
GarnetMicrosoft Research, MITнаписан на C♯ и .NET, совместим с RESP, высокая производительностьмолодой проект, подмножество команд Redis
Memcachedсообщество, BSDочень простой кэш «ключ — значение», многопоточныйнет структур данных, нет персистентности, нет репликации

Redis или Memcached

КритерийRedis и совместимыеMemcached
Типы данныхстроки, хэши, списки, множества, сортированные множества, потокитолько строки (байты)
ПерсистентностьRDB, AOFнет
Репликация и кластерда (Sentinel, Cluster)нет встроенной (шардирование на клиенте)
Pub/sub, блокировки, rate limitданет
Простотабогаче, сложнеепроще, меньше сюрпризов
Многопоточностьядро однопоточное (ввод-вывод частично многопоточный)многопоточный

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

flowchart TD
    A["Нужен кэш или быстрое хранилище"] --> B{"Нужны структуры данных,<br/>pub/sub, блокировки, персистентность?"}
    B -- нет --> C["Memcached<br/>(или Redis-совместимый как универсальный)"]
    B -- да --> D{"Важна свободная лицензия<br/>и drop-in замена?"}
    D -- да --> E["Valkey"]
    D -- "нужна максимальная<br/>производительность на узле" --> F["Dragonfly (проверить лицензию BSL)"]
    D -- "нужны модули Redis<br/>(JSON, поиск)" --> G["Redis (Stack/8.x) с учётом лицензии"]
    D -- "стек на .NET,<br/>хочется расширяемости на C♯" --> H["Garnet (оценить покрытие команд)"]

Примеры

Запуск Valkey как замены Redis

docker run -d --name valkey -p 6379:6379 valkey/valkey:8
redis-cli -p 6379 ping        # PONG: те же клиенты и команды

Подключение из .NET: код не меняется

// Подходит для Redis, Valkey, Dragonfly, KeyDB, Garnet
var mux = await ConnectionMultiplexer.ConnectAsync("localhost:6379");
var db = mux.GetDatabase();
await db.StringSetAsync("greeting", "hello", TimeSpan.FromMinutes(5));
Console.WriteLine(await db.StringGetAsync("greeting"));

Замена сервера сводится к строке подключения. Проверять нужно команды и возможности, а не сам клиент.

Чек-лист совместимости перед заменой

1. Какие команды и структуры использует приложение (скрипты Lua, Streams, модули)
2. Нужен ли кластер: Redis Cluster совместим не везде одинаково
3. Персистентность: RDB/AOF и поведение при перезапуске
4. Eviction и maxmemory: политики вытеснения
5. Метрики и экспортёры: redis_exporter работает не со всеми
6. Нагрузочный тест на реальных профилях запросов

Нюансы и подводные камни

  • Совместимость по протоколу не равна совместимости по поведению. Lua-скрипты, модули, WAIT, кластерные команды и нюансы eviction могут различаться.
  • Модули Redis (RedisJSON, RediSearch и другие) есть не у всех форков; ищите аналоги или пересматривайте схему.
  • Не смешивайте версии в кластере. Обновляйте серверы по очереди, сначала реплики.
  • Кэш может быть единственной копией. Если вы держите там нереплицируемые данные (сессии, очереди), учитывайте персистентность и отказоустойчивость. См. персистентность и кластер.
  • Лицензии меняются. Перед внедрением сверьтесь с актуальным текстом лицензии выбранного продукта.
  • Управляемые сервисы. Облака предлагают Redis-совместимые сервисы (ElastiCache и MemoryDB для Valkey и Redis, Memorystore и другие): часто проще не эксплуатировать самому.

Вопросы с ответами

Связанные темы