Аналоги Redis: Valkey, Dragonfly, KeyDB, Garnet и Memcached
↑ 4.1 Redis и MongoDB · ← Предыдущая
Зачем это на собесе
«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 и другие клиенты работают с совместимыми серверами без изменений кода, меняется только адрес.
Сравнение
| Решение | Кто делает, лицензия | Особенность | На что смотреть |
|---|---|---|---|
| Redis | Redis Ltd, RSALv2/SSPLv1/AGPLv3 (8.x) | эталон, модули (JSON, поиск, time series), самое широкое сообщество | лицензия, часть возможностей в коммерческих редакциях |
| Valkey | Linux Foundation, BSD | форк Redis, drop-in замена, поддержка крупных облаков, улучшения многопоточного ввода-вывода | модули Redis не все доступны; дорожные карты расходятся с Redis |
| Dragonfly | Dragonfly, BSL | многопоточная архитектура «ничего общего», высокая производительность на одном узле, меньше потребление памяти | лицензия BSL, не все команды и сценарии кластера совместимы |
| KeyDB | Snap, BSD | форк с многопоточностью, активно-активная репликация | развитие заметно медленнее, проверяйте актуальность проекта |
| Garnet | Microsoft 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 и другие): часто проще не эксплуатировать самому.
Вопросы с ответами
Почему появился Valkey?
Redis в 2024 году сменил лицензию на RSALv2/SSPLv1, не считающиеся свободными. Linux Foundation при поддержке крупных облачных компаний сделал форк Redis 7.2.4 под лицензией BSD. Valkey остаётся drop-in заменой для большинства приложений.
Нужно ли менять код приложения при переходе с Redis на Valkey?
Обычно нет: протокол тот же, клиент (
StackExchange.Redis) работает без изменений. Проверяют используемые модули, Lua-скрипты, кластерные возможности и метрики.
Когда Memcached, а когда Redis?
Memcached достаточно для простого кэша значений без структур и персистентности. Redis нужен, когда требуются структуры данных, pub/sub, блокировки, rate limiting, потоки или хранение данных с сохранением на диск.
Чем Dragonfly отличается от Redis?
Dragonfly спроектирован как многопоточный сервер («ничего общего» между потоками) и лучше использует многоядерные машины, тогда как ядро Redis исполняет команды в одном потоке. Он совместим с протоколом, но не со всеми командами и сценариями кластера.
Что такое Garnet?
Redis-совместимое хранилище от Microsoft Research на C♯ и .NET под лицензией MIT. Подходит тем, кому важны .NET-стек и производительность, но поддерживает подмножество команд Redis.
Как безопасно заменить Redis на другой сервер?
Составить список используемых команд и возможностей, поднять новый сервер рядом, прогнать тесты и нагрузку, проверить мониторинг, затем переключать трафик постепенно (сначала чтение или часть сервисов) и держать возможность отката.
Связанные темы
- Основы: Redis: структуры данных и команды
- Кэш: Redis как кэш
- Персистентность и кластер: Redis: persistence, репликация, Sentinel, Cluster
- Выбор хранилища: SQL или NoSQL
- Кэш в .NET: Кэширование в .NET