純 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/s | SET 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。バックエンドはなく、データはこのマシンから 出ません。