HestiaStore is an embeddable Java key-value storage engine for large local datasets. It is optimized for predictable file I/O, bounded-memory lookups, range scans, and operational simplicity inside a single application process.
What it is a good fit for
- embedded storage inside a Java service or application
- datasets that do not fit comfortably in memory
- predictable local persistence with optional WAL-based crash recovery
- point lookups plus ordered iteration over large key ranges
- teams that want a pure-Java dependency without native libraries
What it is not trying to be
- a distributed database
- a multi-node replication layer
- a cross-key ACID transaction engine
- a replacement for a full relational database when SQL is the primary need
Start here
- Evaluate HestiaStore if you are deciding whether it matches your workload.
- Install and Quick Start if you want a working example immediately.
- Configuration if you need to tune directories, caching, filters, or custom data types.
- Operations if you need WAL, monitoring, backups, or tuning guidance.
- Architecture if you need implementation detail and internal contracts.
- Contribute & Community if you are contributing code, documentation, or release work.
Key capabilities
- Pure Java embedding with no native dependency requirement
- In-memory or filesystem-backed directories
- Custom key and value type descriptors
- Bloom-filter assisted negative lookups
- Segment-based storage with ordered scans
- Optional write-ahead logging for local crash recovery
- Monitoring snapshots and optional monitoring modules
Performance highlights
All tests ran on a 2024 Mac mini with 16 GB RAM. Absolute numbers vary between runs, so treat the charts as relative comparisons, not absolute guarantees.
Write throughput
Random read throughput
Sequential read throughput
Detailed methodology, workload notes, and links to raw artifacts are available on the Benchmarks page.
Minimal example
import org.hestiastore.index.directory.Directory;
import org.hestiastore.index.directory.MemDirectory;
import org.hestiastore.index.segmentindex.IndexConfiguration;
import org.hestiastore.index.segmentindex.SegmentIndex;
Directory directory = new MemDirectory();
IndexConfiguration<String, String> conf = IndexConfiguration
.<String, String>builder()
.withKeyClass(String.class)
.withValueClass(String.class)
.withName("example")
.build();
try (SegmentIndex<String, String> index = SegmentIndex.create(directory, conf)) {
index.put("hello", "world");
System.out.println(index.get("hello"));
}
For the next step after this example, go to Quick Start.
Documentation paths
- Alternatives for a side-by-side comparison against other embedded engines
- Benchmarks for evaluation
- Quality & Testing for delivery confidence
- Security for reporting and posture
- Release Process for maintainers
Support
- Search or open issues on GitHub Issues
- Read Troubleshooting for common integration problems
