ignix

Crates.ioignix
lib.rsignix
version0.3.2
created_at2025-09-23 17:11:28.721711+00
updated_at2025-12-03 22:35:46.89135+00
descriptionHigh-performance Redis-compatible key-value store built with Rust
homepagehttps://github.com/CycleChain/ignix
repositoryhttps://github.com/CycleChain/ignix
max_upload_size
id1851777
size294,675
Fatih Mert Doğancan (fatihmert)

documentation

https://docs.rs/ignix

README

πŸ”₯ Ignix

High-Performance Redis-Compatible Key-Value Store

Ignix (from "Ignite" + "Index") is a blazing-fast, Redis-protocol compatible key-value store designed for modern multi-core systems. Built with Rust for maximum performance and safety.

Rust License: MIT

✨ Features

  • πŸš€ High Performance: Rust + reactor/worker model for parallel execution
  • πŸ”Œ Redis Protocol Compatible: Drop-in replacement for Redis clients
  • 🧡 Async I/O (mio): Non-blocking reactor + mio::Waker response path
  • πŸ’Ύ AOF Persistence: Background writer with bounded backpressure
  • 🧠 Concurrent Storage: DashMap (sharded locking) in hot path
  • πŸ“Š Benchmarks Included: Scripts and criterion benches

πŸ—οΈ Architecture

Ignix v0.3.2 architecture:

  • Multi-Reactor (Thread-per-Core): Uses SO_REUSEPORT to spawn N independent worker threads (one per CPU core).
  • Pluggable Backend: Supports both mio (epoll/kqueue) and io_uring (Linux only) backends.
  • Shared Nothing: Each thread has its own event loop and handles connections independently.
  • Zero-Lock Networking: No shared listener lock; kernel distributes incoming connections.
  • Zero-Copy Response: Responses are written directly to the network buffer, avoiding intermediate allocations.
  • RESP Protocol: Full Redis Serialization Protocol support with optimized SWAR parsing.
  • Concurrent Storage: DashMap<Bytes, Value> (sharded locking) for high-concurrency data access.
  • AOF Persistence: Dedicated thread, bounded channel, periodic fsync.

πŸš€ Quick Start

Prerequisites

  • Rust 1.80+ (recommended: latest stable)
  • Cargo package manager

Installation

git clone https://github.com/CycleChain/ignix.git
cd ignix
cargo build --release

Running the Server

cargo run --release
# Or enable io_uring backend (Linux only)
cargo run --release -- --backend=uring

The server will start on 0.0.0.0:7379 by default.

Testing with Client Example

# In another terminal
cargo run --example client

Expected output:

+OK
$5
world

πŸ“‘ Supported Commands

Ignix supports the following Redis commands:

Command Description Example
PING Test connectivity PING β†’ +PONG
SET Set key-value pair SET key value β†’ +OK
GET Get value by key GET key β†’ $5\r\nvalue
DEL Delete key DEL key β†’ :1
EXISTS Check if key exists EXISTS key β†’ :1
INCR Increment integer value INCR counter β†’ :1
RENAME Rename a key RENAME old new β†’ +OK
MGET Get multiple values MGET key1 key2 β†’ *2\r\n...
MSET Set multiple key-value pairs MSET k1 v1 k2 v2 β†’ +OK

πŸ”§ Configuration

Environment Variables

  • RUST_LOG: Set logging level (e.g., debug, info, warn, error)

AOF Persistence

Ignix automatically creates an ignix.aof file for persistence. Data is written to AOF and flushed every second for durability.

πŸ§ͺ Testing

Run Unit Tests

cargo test

Run Benchmarks

# Execute benchmark
cargo bench --bench exec

# RESP parsing benchmark  
cargo bench --bench resp

Example Benchmark Results

See the Performance section and benchmark_results/benchmark_results.json.

πŸ”Œ Client Usage

Using Redis CLI

redis-cli -h 127.0.0.1 -p 7379
127.0.0.1:7379> PING
PONG
127.0.0.1:7379> SET hello world
OK
127.0.0.1:7379> GET hello
"world"

Using Any Redis Client Library

Ignix is compatible with any Redis client library. Here's a Python example:

import redis

# Connect to Ignix
r = redis.Redis(host='localhost', port=7379, decode_responses=True)

# Use like Redis
r.set('hello', 'world')
print(r.get('hello'))  # Output: world

πŸ“Š Performance

Benchmarks reflect Ignix v0.3.1. Full raw results are in benchmarks/results/.

SET Throughput (ops/sec)

Data Conns Redis Ignix Ratio (Ignix/Redis)
64B 1 9,249 9,116 0.99x
64B 10 17,628 22,360 1.27x
64B 50 18,236 23,993 1.32x
256B 1 14,615 4,738 0.32x
256B 10 17,880 16,273 0.91x
256B 50 16,898 16,959 1.00x
1KB 1 16,300 6,451 0.40x
1KB 10 16,936 24,323 1.44x
1KB 50 3,313 7,314 2.21x
4KB 1 11,286 8,581 0.76x
4KB 10 17,232 27,933 1.62x
4KB 50 16,343 20,675 1.27x

GET Throughput (ops/sec)

Data Conns Redis Ignix Ratio (Ignix/Redis)
64B 50 35,235 42,495 1.21x
1KB 50 33,701 39,466 1.17x
32KB 20 15,912 21,445 1.35x
256KB 20 18,497 17,408 0.94x
2MB 10 1,054 2,062 1.96x

Note: v0.3.1 introduced Zero-Copy Response Generation, significantly boosting GET performance. Ignix now consistently outperforms or matches Redis across most payload sizes.

Real-World Scenario (Session Store)

Metric Redis Ignix Ratio (Ignix/Redis)
Throughput 3,201 ops/sec 3,996 ops/sec 1.25x
Avg Latency 13.56 ms 10.38 ms 0.76x

Notes:

  • Values rounded from benchmark_results/benchmark_results.json.
  • All runs showed 0 errors, 100% success.

πŸ“Š Benchmark Your Own Workload

Run comprehensive benchmarks with our included tools:

# Quick comparison
python3 quick_benchmark.py

# Detailed analysis with charts
python3 benchmark_redis_vs_ignix.py

# Custom test scenarios
python3 benchmark_redis_vs_ignix.py --data-sizes 64 256 1024 --connections 1 10 25

Architecture Benefits:

  • Sub-millisecond latency for most operations
  • High throughput with async I/O
  • Memory efficient with zero-copy operations where possible
  • Minimal allocations in hot paths

πŸ—οΈ Development

Project Structure

src/
β”œβ”€β”€ bin/ignix.rs        # Server binary
β”œβ”€β”€ lib.rs              # Library exports
β”œβ”€β”€ protocol.rs         # RESP protocol parser/encoder
β”œβ”€β”€ storage.rs          # In-memory storage (Dict)
β”œβ”€β”€ shard.rs           # Command execution logic  
β”œβ”€β”€ net.rs             # Networking and event loop
└── aof.rs             # AOF persistence

examples/
└── client.rs          # Example client

tests/
β”œβ”€β”€ basic.rs           # Basic functionality tests
└── resp.rs            # Protocol parsing tests

benches/
β”œβ”€β”€ exec.rs            # Command execution benchmarks
└── resp.rs            # Protocol parsing benchmarks

Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make your changes
  4. Add tests for new functionality
  5. Run tests (cargo test)
  6. Run benchmarks (cargo bench)
  7. Commit your changes (git commit -m 'Add amazing feature')
  8. Push to the branch (git push origin feature/amazing-feature)
  9. Open a Pull Request

Code Style

  • Follow Rust standard formatting (cargo fmt)
  • Run Clippy lints (cargo clippy)
  • Maintain test coverage for new features

πŸ” Debugging

Enable debug logging: RUST_LOG=debug cargo run --release Monitor AOF: tail -f ignix.aof

🚧 Roadmap (Short)

  • More Redis commands (HASH/LIST/SET)
  • RDB snapshots, metrics/monitoring
  • Clustering and replication

πŸ› Known Limitations

  • Limited command set vs Redis (expanding)
  • No clustering or replication yet
  • RDB snapshots not yet available

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

πŸ™ Acknowledgments

  • Redis for the protocol specification
  • mio for async I/O
  • The Rust community for excellent tooling and libraries

πŸ“ž Support


Built with ❀️ and πŸ¦€ by the CycleChain.io team

Commit count: 7

cargo fmt