KiviDB — быстрая многопоточная альтернатива Redis® и Valkey, написанная на Rust. Она поддерживает протокол Redis (RESP2 и RESP3), поэтому существующие клиенты Redis, redis-cli и библиотеки работают без изменений; кроме того, в неё встроены полнотекстовый и векторный поиск. Сервер задействует каждое ядро благодаря шардированному хранилищу ключ–значение в памяти, а для персистентности использует снапшоты и опциональный журнал дозаписи (append-only file).
На тех же 32 ядрах KiviDB обрабатывает 21 миллион конвейеризованных (pipelined) GET-запросов в секунду — примерно в 9 раз больше Redis 8 и в 2,3 раза больше Dragonfly, при этом p99-задержка вдвое ниже, чем у Dragonfly (подробности — в разделе Производительность).
docker run -d -p 6380:6380 kividb/kividb
redis-cli -p 6380 PING # PONG
KiviDB слушает порт 6380, а не стандартный Redis-порт 6379 — оба сервера могут работать одновременно. Направьте клиент на этот порт или передайте --port 6379.
-
Протокол: совместимый с Redis набор команд (поддерживаемые команды перечислены в COMMANDS.md)
-
Поиск и векторы: команды
FT.*в стиле Redis Stack — полнотекстовый поиск, теги, числовые поля и векторный поиск ANN (FLAT / HNSW) -
Сценарии Lua: опциональная фича Cargo; команды
EVAL,SCRIPT,FUNCTION,FCALLи связанные с ними доступны в сборках с--features lua(см. Scripting commands (Lua)) -
TLS: опциональная фича Cargo (
--features tls) -
Адрес по умолчанию:
0.0.0.0:6380с включённым защищённым режимом -
Лицензия: GNU Affero General Public License v3 (AGPL-3.0-only), открытый исходный код; использование KiviDB не распространяет действие AGPL на ваше приложение (подробности — в разделе Лицензия)
Репозиторий: github.com/kividbio/kividb · Сайт: kividb.io
Переходите с Redis? Руководство по миграции · Совместимость и отличия · Примеры клиентов · Бенчмарки · Релизы · Kubernetes-оператор
Сравнение с конкурентами
| KiviDB | Redis 8 | Valkey 8 | Dragonfly | KeyDB | |
|---|---|---|---|---|---|
Лицензия |
AGPL-3.0 |
RSALv2, SSPLv1 или AGPL-3.0 |
BSD-3-Clause |
BSL 1.1 |
BSD-3-Clause |
Язык |
Rust |
C |
C |
C++ |
C++ |
Выполнение команд |
каждое ядро (шардирование) |
один поток (I/O-потоки) |
один поток (I/O-потоки) |
каждое ядро (shared-nothing) |
несколько потоков |
Полнотекстовый и векторный поиск ( |
встроен |
встроен (Query Engine) |
отдельный модуль |
встроен |
нет |
Скриптинг Lua |
сборка |
да |
да |
да |
да |
Данные актуальны на октябрь 2026 года. Если что-то устарело или неверно, откройте issue.
Производительность
Пропускная способность, задержка, векторный поиск и векторная загрузка. Нажмите для просмотра видео в полном разрешении.
Все приведённые ниже результаты получены в ходе одной сессии в октябре 2026 года на AWS Graviton3 bare metal: сервер на c7gn.metal (64 vCPU), ограниченный 32 ядрами, и генератор нагрузки на втором c7gn.metal в той же группе размещения. Каждый движок запускался на сервере по очереди, в одиночестве.
Ключ–значение
Тест с помощью memtier_benchmark через run-matrix.sh из kivi-benchmark: 10 миллионов ключей, значения по 100 байт, 30 секунд на сценарий, среднее из двух прогонов; 300 соединений с конвейеризацией и 1 200 без неё.
| ops/s | KiviDB 1.1.0 | Dragonfly 2.0.2 | Redis 8.10 | Redis Cluster (32 шарда) |
|---|---|---|---|---|
GET, pipeline 16 |
21,2M |
9,1M |
2,4M |
4,7M |
SET, pipeline 16 |
19,2M |
8,5M |
2,0M |
4,7M |
GET, без конвейеризации |
3,07M |
3,35M |
1,32M |
1,46M |
SET, без конвейеризации |
3,12M |
3,38M |
1,54M |
1,46M |
p99-задержка, GET / SET, pipeline 16 |
0,36 / 0,42 мс |
0,88 / 1,07 мс |
2,2 / 2,7 мс |
|
Память на ключ |
177 Б |
134 Б |
178 Б |
183 Б |
Векторный поиск
redis/vector-db-benchmark на наборе данных glove-25-angular (1,18M векторов, 25 измерений): HNSW с M=16 и EF_CONSTRUCTION=256, 100 клиентов, загружающих данные пакетами по 64 вектора, затем запросы при ef 64, 128, 256 и 512.
| KiviDB 1.1.0 | Dragonfly 2.0.2 | Redis 8.10 (query engine) | |
|---|---|---|---|
Запросов/с при ef 64 (recall@10) |
59,3k (0,943) |
41,3k (0,912) |
31,8k (0,912) |
Запросов/с при ef 128 |
50,7k (0,961) |
40,3k (0,937) |
28,9k (0,937) |
Запросов/с при ef 256 |
31,5k (0,989) |
36,2k (0,979) |
21,1k (0,979) |
Запросов/с при ef 512 |
18,7k (0,998) |
29,8k (0,995) |
13,7k (0,995) |
Загрузка и построение индекса |
31 с |
13 с |
38 с |
Память после загрузки |
1,66 ГБ |
1,13 ГБ |
1,07 ГБ |
Нагрузка до насыщения
Второй тест — на Azure, по методике latency/throughput/saturation: вместо фиксированной нагрузки каждые 30 секунд добавляются клиенты (от 40 до 1 600 на базу данных) вплоть до насыщения сервера. Каждый клиент посылает 10 конвейеризованных пар SET+GET по 10 миллионам ключей, затем делает паузу 10 мс. Каждый сервер работал на отдельной VM с 8 vCPU arm64 (D8ps_v5); Redis Cluster — на четырёх VM по 2 vCPU (итого 8 vCPU). KiviDB 1.1.2, октябрь 2026 года.
Весь прогон — 20 минут с ускорением 60×. Нажмите для просмотра видео в полном разрешении.
| Пиковая пропускная способность | p50 / p99 при 1 600 клиентах | Ошибки | |
|---|---|---|---|
KiviDB 1.1.2 |
2,08M req/s |
4,3 / 13,9 мс |
0 |
Dragonfly 2.0.2 |
1,56M req/s |
10,1 / 33,9 мс |
0 |
Redis 8.10.2 Cluster (4 × 2 vCPU) |
0,97M req/s |
26,8 / 44,9 мс |
0 |
Redis 8.10.2 |
0,49M req/s |
55,2 / 72,1 мс |
0 |
Задержка измерена на пакет конвейеризованных запросов. Без конвейеризации KiviDB показал примерно на 20% меньше, чем Dragonfly на этих машинах (около 8% на bare-metal). Обвязка теста, исходные данные и видео прогона находятся в kivi-benchmark/ramp-saturation; дашборд прогона — снапшот Grafana.
-
Методология и скрипты: kivi-benchmark
-
Последний автоматический прогон: benchmarks/LATEST.md
Результаты зависят от среды. Публикуемые цифры — это один контролируемый замер, а не гарантия; измеряйте на своём железе и своей нагрузке.
Векторный поиск (команды FT.* в стиле Redis Stack)
KiviDB реализует совместимые с Redis Stack команды поиска и работы с векторами, поэтому существующие клиенты и руководства в основном работают без изменений. Их можно применять для полнотекстового поиска (BM25), тегов и числовых полей, а также векторного ANN (FLAT или HNSW) по полям хешей.
Быстрый старт
-
Создайте индекс по ключам с заданным префиксом, объявив хотя бы одно поле
VECTOR(HNSW или FLAT) и опциональные поляTEXT/TAG/NUMERIC:
redis-cli -p 6380 FT.CREATE idx ON HASH PREFIX 1 doc: SCHEMA \
vec VECTOR HNSW 10 TYPE FLOAT32 DIM 128 DISTANCE_METRIC COSINE M 16 EF_CONSTRUCTION 128
-
Сохраняйте векторы в виде сырых байтов FLOAT32 в little-endian-порядке в поле хеша (
DIM × 4байт) — тот же формат, что в Redis Stack и в блобахredis-py/numpy. Используйте бинарно-безопасныйHSETвашего клиента (примеры есть в интеграционных тестах вtests/e2e/). -
Выполните запрос с KNN (Диалект 2), передав вектор запроса как именованный бинарный параметр:
redis-cli -p 6380 FT.SEARCH idx '*=>[KNN 10 @vec $q]' PARAMS 2 q <blob> DIALECT 2
Полный список команд, фильтры, гибридный поиск и граничные случаи описаны в COMMANDS.md (ищите FT.CREATE, FT.SEARCH, FT.HYBRID и т.д.).
Персистентность и перезапуск
-
Нативные снапшоты (
dump.kdb) хранят ключи, схемы индексов и, если вы выполняетеSAVE/BGSAVEпри заполненных индексах, HNSW-граф каждого векторного поля — после перезапуска качество поиска соответствует графу, который был до остановки. -
Пока поисковые индексы восстанавливаются при запуске, большинство команд возвращают
LOADINGдо завершения восстановления;PING,INFOи несколько других команд работают в это время. -
После массовой загрузки данных выполните
SAVE(или запланируйтеBGSAVE), чтобы при следующем запуске граф был загружен с диска, а не перестроен из хешей.
Варианты сборки
KiviDB поставляется в четырёх вариантах, которые выбираются через флаги Cargo features во время сборки:
| Вариант | Cargo features | Добавляет |
|---|---|---|
|
нет |
основной сервер без Lua и TLS |
|
|
Lua-скриптинг ( |
|
|
TLS-листенер, а также TLS между узлами кластера и репликами |
|
|
оба варианта |
В сборке без Lua команды скриптинга возвращают ошибку. Сборка без TLS откажется запускаться, если указан --tls-port, вместо того чтобы работать в режиме открытого текста.
Сборка из исходников
Требуется стабильная (stable) цепочка инструментов Rust (rust-toolchain.toml задаёт stable с rustfmt и clippy). Крейт использует редакцию 2024; самая старая проверяемая версия Rust — 1.89, именно с ней собирает Dockerfile.
git clone https://github.com/kividbio/kividb.git
cd kividb
cargo build --release # вариант по умолчанию
cargo build --release --features lua # со скриптингом Lua
cargo build --release --features tls # с TLS
cargo build --release --features lua,tls # полная сборка
./target/release/kividb
На Linux сервер использует io_uring при поддержке ядра, а иначе переключается на Tokio (--io-model auto — по умолчанию).
Чтобы собрать Docker-образ самостоятельно: docker build -t kividb . собирает вариант по умолчанию; docker build --build-arg KIVIDB_FEATURES=lua,tls -t kividb:full . — другой вариант.
Запуск KiviDB
./target/release/kividb # слушает на 0.0.0.0:6380
redis-cli -p 6380 PING
Подойдёт любой Redis-клиент — направьте его на порт 6380.
Защищённый режим (Protected mode)
Защищённый режим включён по умолчанию, как и в Redis. Пока он активен, адрес привязки не задан (--bind или bind в файле конфигурации) и пользователь default не имеет пароля — подключаться могут только клиенты на той же машине (через loopback). Любой другой клиент получает ошибку -DENIED с объяснением вариантов и сразу отключается.
Чтобы принимать клиентов с других машин, выполните одно из следующего:
-
задайте пароль:
--requirepass <password>илиACL SETUSER default ><password>; -
задайте адрес привязки:
--bind <address>; -
отключите защищённый режим:
--protected-mode no,protected-mode noв файле конфигурации илиCONFIG SET protected-mode noс локального клиента.
Если вы отключаете режим или привязываетесь к публичному адресу, убедитесь, что сервер недоступен из интернета без пароля.
Пакеты для Linux
На странице релизов опубликованы пакеты .deb и .rpm для архитектур amd64 и arm64. Они устанавливают бинарный файл, юнит systemd, системного пользователя kividb и стандартный /etc/kividb/kividb.conf, настроенный на прослушивание только loopback. Установка автоматически включает и запускает юнит; обновление перезапускает его:
sudo apt install ./kividb_amd64.deb # или: sudo rpm -i kividb.x86_64.rpm
redis-cli -p 6380 PING
Данные (снапшот, AOF, nodes.conf) хранятся в /var/lib/kividb, логи идут в журнал: journalctl -u kividb. Чтобы принимать клиентов с других машин, задайте пароль и измените bind в /etc/kividb/kividb.conf.
Docker
Образы публикуются на Docker Hub и в GitHub Container Registry с одинаковыми тегами в обоих реестрах:
docker pull kividb/kividb:latest
# или
docker pull ghcr.io/kividbio/kividb:latest
latest и теги версий вида v1.1.0 соответствуют варианту по умолчанию; v1.1.0-lua, v1.1.0-tls и v1.1.0-full — остальным вариантам. Образы собраны для amd64 и arm64.
docker run -p 6380:6380 kividb/kividb
Контейнер доступен через сеть, а не через loopback, поэтому в команде запуска образа по умолчанию задан --protected-mode no. Аргументы, которые вы передаёте, заменяют это значение по умолчанию, то есть защищённый режим включается снова. Если вы передаёте собственные флаги, задайте пароль (рекомендуется) или явно добавьте --protected-mode no:
docker run -p 6380:6380 ghcr.io/kividbio/kividb \
--requirepass "change-me" \
--databases 8 \
--loglevel debug
С персистентностью AOF (подключите том, чтобы данные пережили перезапуск; сервер работает как UID 1000 в /home/kividb):
docker run -p 6380:6380 \
-v $(pwd)/data:/home/kividb \
ghcr.io/kividbio/kividb --aof --requirepass "change-me"
При --aof каждая запись добавляется в appendonly.aof и воспроизводится при старте: в случае сбоя теряется не более примерно последней секунды записей (интервал fsync), а не всё накопленное с момента последнего снапшота. Если AOF присутствует, он является источником истины и снапшот не загружается — подробности в docs/PERSISTENCE.md.
Образ дистроless: в нём нет ни оболочки, ни redis-cli. Подключайтесь из другого контейнера, например: docker run --rm -it --network container:<name> redis redis-cli -p 6380.
io_uring в контейнерах: стандартный профиль seccomp Docker блокирует io_uring в последних версиях, и KiviDB переключается на Tokio. Чтобы разрешить io_uring на Linux-хосте, запустите с --security-opt seccomp=unconfined (убедитесь, что понимаете последствия, прежде чем применять это в продакшене).
Готовые бинарные файлы
Готовые бинарные файлы для Linux (x86_64, aarch64) и macOS (Apple silicon, Intel) публикуются на GitHub Releases. Ссылки latest/download ниже всегда указывают на последний релиз; замените latest/download на download/v1.1.0, чтобы зафиксировать конкретную версию.
# Linux x86_64
curl -LO https://github.com/kividbio/kividb/releases/latest/download/kividb-linux-x86_64.tar.gz
tar xzf kividb-linux-x86_64.tar.gz
./kividb
# Linux aarch64 (CPU ARMv8.1 и новее: Graviton2 и выше, Ampere; Raspberry Pi 4 не подходит)
curl -LO https://github.com/kividbio/kividb/releases/latest/download/kividb-linux-aarch64.tar.gz
# macOS, Apple silicon / Intel
curl -LO https://github.com/kividbio/kividb/releases/latest/download/kividb-darwin-aarch64.tar.gz
curl -LO https://github.com/kividbio/kividb/releases/latest/download/kividb-darwin-x86_64.tar.gz
Каждый вариант, кроме стандартного, содержит своё название в имени файла: kividb-lua-linux-x86_64.tar.gz, kividb-tls-…, kividb-full-…. Стандартный вариант для Linux также упакован как kividb_amd64.deb / kividb_arm64.deb и kividb.x86_64.rpm / kividb.aarch64.rpm — они собраны с помощью nfpm из packaging/nfpm.yaml. Файл SHA256SUMS.txt содержит контрольные суммы всех файлов в релизе.
curl -LO https://github.com/kividbio/kividb/releases/latest/download/kividb_amd64.deb && sudo dpkg -i kividb_amd64.deb
curl -LO https://github.com/kividbio/kividb/releases/latest/download/kividb.x86_64.rpm && sudo rpm -i kividb.x86_64.rpm
Начиная с версии 1.2.0 каждый файл релиза и каждый образ содержат подписанное подтверждение происхождения сборки — GitHub artifact attestation, удостоверяющее, что артефакт был собран рабочим процессом этого репозитория из помеченного коммита. Контрольная сумма подтверждает целостность загрузки, аттестация — подлинность источника. Через GitHub CLI:
gh attestation verify kividb-linux-x86_64.tar.gz --repo kividbio/kividb
gh attestation verify oci://ghcr.io/kividbio/kividb:v1.2.0 --repo kividbio/kividb
Конфигурация
KiviDB настраивается с помощью флагов командной строки или файла конфигурации в стиле Redis (по одной директиве на строку, например port 6380 или appendonly yes). Файл читается из /etc/kividb/kividb.conf, если он существует; --configfile <path> позволяет указать другой. Флаг командной строки имеет приоритет над соответствующей настройкой в файле. Полный список параметров — в выводе kividb --help.
| Флаг | По умолчанию | Описание |
|---|---|---|
|
|
Порт прослушивания |
|
|
Адрес прослушивания. Явное задание отключает защищённый режим |
|
|
См. Защищённый режим |
|
|
Рабочие потоки; авто — количество ядер минус 2 (все ядра, если их менее 4) |
|
|
Количество баз данных |
|
рабочий каталог |
Где хранятся |
|
выкл. |
Персистентность через журнал дозаписи (append-only file) |
|
|
Ограничение памяти |
|
|
Поведение при достижении лимита: |
|
|
|
|
стандартный вывод ошибок |
Запись лога в файл |
|
|
Формат строк лога |
|
|
|
|
нет |
Пароль для пользователя |
|
нет |
ACL-файл для загрузки пользователей |
|
нет |
Репликация с указанного первичного узла |
|
порт сервера |
Порт, объявляемый первичному узлу через |
|
выкл. |
Порог slowlog в микросекундах ( |
|
|
Количество хранимых записей slowlog |
|
|
Режим кластера: шина кластера на |
|
|
Время без ответа, после которого узел считается недоступным |
|
|
TLS-листенер (только в сборках с TLS) |
|
нет |
Сертификат и ключ сервера (PEM) |
|
нет |
CA для проверки клиентских сертификатов |
|
|
Требовать ли от клиентов сертификат (только совместно с |
|
|
TLS
TLS-клиенты подключаются на отдельный порт --tls-port; незашифрованный трафик остаётся на --port.
cargo build --release --features tls
./target/release/kividb --port 6380 --tls-port 6381 --tls-cert-file cert.pem --tls-key-file key.pem
redis-cli --tls -p 6381 --cacert ca.pem # ca.pem: CA, подписавший cert.pem
Клиентские сертификаты (взаимный TLS, mTLS). При указании --tls-ca-cert-file ca.pem клиенты обязаны предъявить сертификат, подписанный этим CA; остальные будут отклонены на этапе handshake. --tls-auth-clients optional принимает клиентов без сертификата, но отклоняет невалидный; --tls-auth-clients no не запрашивает сертификат вовсе. Пример для redis-cli: redis-cli --tls -p 6381 --cacert ca.pem --cert client.pem --key client.key.
Клиенты обязаны использовать TLS на TLS-порту. Незашифрованное подключение к нему (например, redis-cli -p 6381 без --tls) не проходит handshake, а сервер записывает в лог [TLS] handshake failed. Для memtier_benchmark добавьте --tls (и --tls-skip-verify для самоподписанного сертификата).
Логи и ошибки
Лог пишется в стандартный вывод ошибок или в --logfile. Формат лога описан в docs/LOGGING.md; предупреждения, ошибки, ответы с ошибками и рекомендации по ним — в docs/ERRORS.md.
Проверка обновлений при запуске
При запуске релизная сборка KiviDB делает один HTTPS-запрос к https://github.com/kividbio/kividb/releases/latest — той самой странице, которую вы бы открыли для поиска новой версии. GitHub отвечает редиректом на тег нового релиза; если он новее запущенной сборки, KiviDB выводит краткое уведомление со ссылкой перед стартовым баннером. Передаётся только сам запрос с заголовком User-Agent: kividb/<version> — без имени хоста, конфигурации, ключей, данных или идентификатора. GitHub видит IP-адрес источника запроса, как любой веб-сервер.
Сервер ждёт ответа не более 1,5 секунды; сбой логируется только на уровне debug и никогда не влияет на клиентов. Из ответа принимается только тег в виде номера версии, ничего другого не выводится.
Отключить проверку можно любым из способов:
-
--update-check noв командной строке; -
update-check noв файле конфигурации; -
переменная окружения
KIVIDB_NO_UPDATE_CHECK=1.
Проверка также не выполняется в debug-сборках и при установленной переменной окружения CI. --update-check-url перенаправляет запрос на другой https://-адрес, например на зеркало внутри закрытой сети. Подробности — в docs/UPDATE_CHECK.md.
Участие в разработке
Мы рады вкладу от сообщества. Как собирать, тестировать и отправлять изменения — описано в CONTRIBUTING.md. Вклад принимается в соответствии с Лицензионным соглашением участника (CLA), которое вы подписываете при первом pull request.
Пожалуйста, соблюдайте Кодекс поведения. Изменения в каждом релизе перечислены в Changelog.
Безопасность
Пожалуйста, не сообщайте об уязвимостях безопасности в публичных issues. Инструкции по конфиденциальному сообщению — в SECURITY.md.
Лицензия
Copyright (c) 2026 KIVIDB PRIVATE LIMITED.
KiviDB — программное обеспечение с открытым исходным кодом, распространяемое под лицензией GNU Affero General Public License версии 3 (AGPL-3.0-only), одобренной OSI. Вы можете использовать, изменять и распространять его в соответствии с её условиями. См. NOTICE.
Использование KiviDB не распространяет действие AGPL на ваше приложение. Приложение, взаимодействующее с KiviDB по сети через любой Redis-клиент, является отдельной программой: вы можете использовать немодифицированный KiviDB как базу данных в любом продукте — открытом или закрытом, коммерческом или некоммерческом — без каких-либо обязательств в отношении кода вашего приложения. AGPL предъявляет лишь одно требование сверх GPL: если вы модифицируете сам KiviDB и предоставляете другим доступ к изменённой версии по сети (например, как размещённый сервис), вы должны предложить им исходный код своего варианта KiviDB.
Коммерческая лицензия. KIVIDB PRIVATE LIMITED владеет авторскими правами на KiviDB и также предлагает его по коммерческой лицензии для организаций, которые не могут использовать программное обеспечение под AGPL или хотят изменять либо встраивать KiviDB без публикации своих изменений. Пишите на support@kividb.io.
Наше обязательство. Каждая версия KiviDB, выпущенная нами под AGPLv3, останется доступной под AGPLv3. Лицензионное соглашение участника позволяет нам предлагать коммерческую лицензию параллельно; оно не является способом отозвать открытую версию.
FAQ
-
Могу ли я использовать KiviDB как базу данных для своего закрытого или коммерческого приложения? Да. Ваше приложение подключается к KiviDB по сети и не является производным от KiviDB — AGPL не налагает на него никаких обязательств.
-
Могу ли я запустить KiviDB как сервис для своих пользователей или клиентов? Да. Если вы запускаете его без изменений, публиковать ничего не нужно. Если вы изменяете KiviDB и предоставляете изменённую версию через сеть, вы должны предложить её исходный код пользователям этого сервиса.
-
Считаются ли клиентские библиотеки или конфигурация модификациями? Нет. Redis-клиенты, файлы конфигурации, скрипты и функции, которые вы отправляете в KiviDB, не являются частью KiviDB.
-
Моя организация не разрешает использовать программное обеспечение под AGPL. Для этого случая существует коммерческая лицензия: support@kividb.io.
Товарные знаки
Redis® является зарегистрированным товарным знаком Redis Ltd. Все права на него принадлежат Redis Ltd. Любое использование этого знака KiviDB носит исключительно справочный характер и не означает какого-либо спонсорства, одобрения или аффилиации между Redis и KiviDB. KiviDB не связан с Redis Ltd. Прочие упомянутые названия являются товарными знаками их соответствующих владельцев.