EN·日本語·简体中文

純 Rust・依存ゼロ・Redis 互換のサービングエンジン。

ひとつのエンジンに三つの形態 — スタンドアロンの サーバー、プロセス内 Rust ライブラリ、そしてブラウザで動く WebAssembly モジュール。どの形態も RESP2 を話すため、 redis-cli も既存の Redis クライアントライブラリも そのまま使えます。

インストール
# サーバー
cargo install kevy
# コンテナ
docker run --rm -p 6379:6379 goliakk/kevy:latest
# ブラウザ
npm i @goliajp/kevy
計測 · 四者アリーナ

主張ではなく、計測。

1.60×redis 8 (GET)
3.00×valkey 9.1 (GET)
3.60×dragonfly (GET)
server構成GET ops/sSET ops/s相対値 (GET)
kevy 3.18.0 --threads 8, io_uring 6,389,776 ±2.8k 6,384,676 ±582k
redis 8 (8.4.x) --io-threads 8 3,996,004 ±198k 2,460,024 ±112k
valkey 9.1 --io-threads 8 2,132,196 ±68k 1,598,402 ±0.1k
dragonfly (2025-06) --proactor_threads=8 1,776,199 ±42k 1,453,224 ±28k

プロトコル: redis-benchmark -c 50 -P 16 -n 8M -t get,set、 5 回実行の中央値 ± 標本標準偏差。同一マシン(i7-10700K、8C16T、Linux 6.12)で フェアファイト: サーバーをコア 0–7、ベンチマーククライアントをコア 8–15 に固定。 全サーバーを同じクライアント・同じプロトコル・同じマシンで計測。 再現は bench/arena.sh、 詳細な分解は bench/PERF-DECOMP-V4-T9.md

機能 · ひとつのエンジン

足元は Redis パリティ、その上にサービングエンジン。

Redis 互換 KVRESP2 ワイヤプロトコル。98 コマンドの応答を valkey 9.1 とバイト単位で照合。文字列・ハッシュ・リスト・セット・ソート済みセット・TTL。
宣言的インデックス範囲 / ユニークのセカンダリインデックスを書き込みパスで維持 — ドリフトせず、データから再構築可能。ワンホップのハイドレーション付き(IDX.*)。
CJK 全文検索辞書不要の CJK バイグラム分割 + BM25 ランキングを、インデックスの一種として — 同じクエリ面、同じハイドレーション。
ベクトル検索HNSW ANN インデックスに加え、サーバーサイドのハイブリッド検索: BM25 × KNN 融合を 1 クエリで。
CDC フィード(generation, offset) 位置と厳密な復旧点を持つ変更ストリーム — ビルトインの outbox。
レプリケーションとフェイルオーバーハートビート / ACK による遅延の実測値付きストリーミングレプリケーション、計画的ゼロロス引き継ぎ(FAILOVER)、クォーラムによるクラッシュ選出。
一貫性の階段リクエスト単位のオプトイン: WAIT、read-your-writes トークン、bounded staleness、クォーラムフェンス付き書き込み。
MCP サーバー公式 kevy-mcp: AI エージェント向け stdio JSON-RPC。スキーマは COMMAND DOCS と同じ動詞コントラクトから生成。
WebAssemblyブラウザで動くエンジン(@goliajp/kevy): OPFS / IndexedDB 永続化、タブ間 pub/sub、依存ゼロ。
組み込みと IoTfeature ゲートで kevy-embedded を最小の KV+TTL コアまで削減。musl / ARM クロスビルドとサイズ / RSS 予算ゲートを CI に常設。
ライブデモ · WebAssembly

いま、このブラウザで kevy を動かす。

デモは実物のエンジンを約 420 KB の wasm モジュールとして読み込みます。ブラウザ API 上のコマンドライン REPL、リロード後も残る OPFS 永続化(IndexedDB フォールバック)、 タブをまたぐ pub/sub。バックエンドはなく、データはこのマシンから 出ません。

ライブデモを開く →