New in v1.11–v1.12: vector, full-text and hybrid search · adaptive group commit. Apache 2.0. Vector search docs → ★ Star us on GitHub ↗
MEASUREDYCSB 0.17 · 100M keys · 0 errors

Values on NVMe.
Index in DRAM.
RAM bill optional.

VeltrixDB stores values on NVMe and keeps only the index in memory — so the dataset is priced like SSD, not DRAM, and it runs on any cloud or bare metal.

Free & open source (Apache 2.0) · one binary · vector, full-text and hybrid search built in · self-hosted, with a Helm chart and Kubernetes operator.

427K reads/s · YCSB 2.8ms read P99 · 100M keys 0 failures · 100M durable writes
veltrix@nvme — quickstart
$ docker run -p 9000:9000 ghcr.io/veltrixdb/veltrixdb:latest[server] plaintext listening on :9000
$ echo -e "PUT hello world\nGET hello\nPING" | nc localhost 9000OKworldPONG
Measured reads/s · YCSB · 100M keys, all cached 427K/s
Built on the systems primitives you already trust
O_DIRECT NVMeWiscKey KV-separationgroup-commit WALCRC32C checksumsFNV-1a shardingRaftHNSW · BM25 · RRFPrometheus / GrafanaKubernetes operator
The problem
At large key counts, you're not paying for a database. You're paying for RAM.

Redis and other in-memory stores keep every value in DRAM — hot or cold. Cloud RAM costs far more per gigabyte than NVMe SSD, so the bigger your dataset grows, the more you pay simply to hold it in memory. That's a bill that scales with your data, not your revenue.

In-memory store (e.g. Redis)
≥ 1 TB
RAM · 1B keys × 1 KB values
  • Every value pinned in memory, hot or cold
  • P99 spikes when AOF rewrite runs
  • Cost grows linearly with dataset size
≈ 4–7× less RAM · 1 KB values
VeltrixDB on NVMe
142–232 GB
RAM for the index · the ~1.4 TB of values sit on NVMe
  • Values on NVMe, only the index in DRAM
  • Value-log GC runs off the read path
  • You pay for machines, not a per-op meter
Arithmetic from measured per-key costs, not a billion-key benchmark. VeltrixDB’s index takes ~142 B/key (native index, measured at 5M keys) plus ~90 B/key for the ordered index unless --disable-ordered-index, plus whatever cache you give it; a 1 KB value packs into ~1.37 KB of NVMe. An in-memory store holds every value in RAM plus its own per-key overhead. The saving grows with value size: at 128-byte values the index takes about as much RAM as the values do, so small-value workloads save little. Size your own node with the sizing rules.
The shift

One idea, executed properly.

Move the bytes to where they're cheap. Keep only what you need in memory. Never let cleanup touch the fast path.

01 · Storage

Values on NVMe

Written once to an append-only value log. There is no LSM compaction; GC only copies still-live values out of mostly-dead segments — so write amplification stays near 1× by design, not the 10–30× typical of LSM trees.

02 · Memory

Index in DRAM

Only the index lives in memory — ~142 B/key measured — off the Go heap on cgo builds. A read is a cache hit (~92 ns in-process) or one 4 KB-aligned, CRC-checked NVMe read on a miss.

03 · Latency

P99 that holds

Value-log GC runs off the fast path and backs off when read latency rises. In the YCSB run: 100M durable writes and 10M reads, zero failures, read P99 2.8 ms.

See the full read/write path →
427K/s
Reads / sec / node
Measured — YCSB 0.17 workload C, 100M keys, 200 threads, dataset fully cached.
2.8ms
P99 read latency
Measured — same run, 100% cache hits (avg 461 µs).
18K/s
Durable writes / sec
Measured — 100M-key load, fdatasync on every write, P99 47 ms. June run, fixed 5 ms window (before adaptive group commit).
0
Failures
Across the 100M-key load and 10M reads in the YCSB run.
What it means for the business

Four outcomes your board will care about.

Latency

An SLA you can actually promise.

No LSM compaction to fight your reads, and value-log GC backs off when read latency rises. Measure your own tail with the same YCSB harness we publish.

2.8msread P99 · YCSB, 100M keys, all cached
Cost

A bill that stops chasing your data.

Your data sits on NVMe instead of RAM — capacity priced like SSD, on hardware you run, with no per-operation meter to model.

4–7×less RAM at 1 KB values · per-key arithmetic, grows with value size
Portability

No cloud holds you hostage.

One Helm chart runs identically on GKE, EKS, AKS, or bare metal. Change providers without rewriting your data layer or your contracts.

4 platformsGKE · EKS · AKS · Bare metal
Time to value

Days to production, not quarters.

One Helm install deploys the StatefulSet, NVMe StorageClass, PodDisruptionBudget, and Prometheus scraping — 70+ metric families and a PrometheusRule included. The chart and the operator live in their own repositories, next to the server’s.

1 commandhelm install
Measured, not projected

427K reads/s on one node. Here's the distribution.

YCSB 0.17 workload C: 10M reads over 100M keys, 200 threads, single AWS node with 4× NVMe. The whole dataset fit in the 400 GB cache, so these are cache hits — not NVMe misses. Pure-Go build from June 2026. Full run — hardware spec, YCSB config, raw output — on the performance page.

Read · avg
461µs
461 µs · cache hit
Read · P95
2.07ms
2,069 µs · cache hit
Read · P99
2.77ms
2,771 µs · cache hit
Full benchmark & methodology ↗ Compare against Redis
Documentation

Everything you need to ship on VeltrixDB

Architecture deep-dives, vector and hybrid search, client SDKs for 6 languages, a full config reference, and Kubernetes guides — in one place.

Browse full docs ↗

See your own numbers in 30 minutes.

Your workload ───────▶ Your P99
No commitment · 30-min session · Free migration & cost analysis included