## Backend Support HeroDB supports two storage backends, both with full encryption support: - **redb** (default): Full-featured, optimized for production use - **sled**: Alternative embedded database with encryption support ### Starting HeroDB with Different Backends ```bash # Use default redb backend ./target/release/herodb --dir /tmp/herodb_redb --port 6379 # Use sled backend ./target/release/herodb --dir /tmp/herodb_sled --port 6379 --sled # Use redb with encryption ./target/release/herodb --dir /tmp/herodb_encrypted --port 6379 --encrypt --key mysecretkey # Use sled with encryption ./target/release/herodb --dir /tmp/herodb_sled_encrypted --port 6379 --sled --encrypt --key mysecretkey ``` ### Command Support by Backend Command Category | redb | sled | Notes | |-----------------|------|------|-------| **Strings** | | | | SET | ✅ | ✅ | Full support | GET | ✅ | ✅ | Full support | DEL | ✅ | ✅ | Full support | EXISTS | ✅ | ✅ | Full support | INCR/DECR | ✅ | ✅ | Full support | MGET/MSET | ✅ | ✅ | Full support | **Hashes** | | | | HSET | ✅ | ✅ | Full support | HGET | ✅ | ✅ | Full support | HGETALL | ✅ | ✅ | Full support | HDEL | ✅ | ✅ | Full support | HEXISTS | ✅ | ✅ | Full support | HKEYS | ✅ | ✅ | Full support | HVALS | ✅ | ✅ | Full support | HLEN | ✅ | ✅ | Full support | HMGET | ✅ | ✅ | Full support | HSETNX | ✅ | ✅ | Full support | HINCRBY/HINCRBYFLOAT | ✅ | ✅ | Full support | HSCAN | ✅ | ✅ | Full support with pattern matching | **Lists** | | | | LPUSH/RPUSH | ✅ | ✅ | Full support | LPOP/RPOP | ✅ | ✅ | Full support | LLEN | ✅ | ✅ | Full support | LRANGE | ✅ | ✅ | Full support | LINDEX | ✅ | ✅ | Full support | LTRIM | ✅ | ✅ | Full support | LREM | ✅ | ✅ | Full support | BLPOP/BRPOP | ✅ | ❌ | Blocking operations not in sled | **Expiration** | | | | EXPIRE | ✅ | ✅ | Full support in both | TTL | ✅ | ✅ | Full support in both | PERSIST | ✅ | ✅ | Full support in both | SETEX/PSETEX | ✅ | ✅ | Full support in both | EXPIREAT/PEXPIREAT | ✅ | ✅ | Full support in both | **Scanning** | | | | KEYS | ✅ | ✅ | Full support with patterns | SCAN | ✅ | ✅ | Full cursor-based iteration | HSCAN | ✅ | ✅ | Full cursor-based iteration | **Transactions** | | | | MULTI/EXEC/DISCARD | ✅ | ❌ | Only supported in redb | **Encryption** | | | | Data-at-rest encryption | ✅ | ✅ | Both support [age](age.tech) encryption | AGE commands | ✅ | ✅ | Both support AGE crypto commands | **Full-Text Search** | | | | FT.CREATE | ✅ | ✅ | Create search index with schema | FT.ADD | ✅ | ✅ | Add document to search index | FT.SEARCH | ✅ | ✅ | Search documents with query | FT.DEL | ✅ | ✅ | Delete document from index | FT.INFO | ✅ | ✅ | Get index information | FT.DROP | ✅ | ✅ | Drop search index | FT.ALTER | ✅ | ✅ | Alter index schema | FT.AGGREGATE | ✅ | ✅ | Aggregate search results | ### Performance Considerations - **redb**: Optimized for concurrent access, better for high-throughput scenarios - **sled**: Lock-free architecture, excellent for specific workloads ### Encryption Features Both backends support: - Transparent data-at-rest encryption using the `age` encryption library - Per-database encryption (databases >= 10 are encrypted when `--encrypt` flag is used) - Secure key derivation using the master key ### Backend Selection Examples ```bash # Example: Testing both backends redis-cli -p 6379 SET mykey "redb value" redis-cli -p 6381 SET mykey "sled value" # Example: Using encryption with both ./target/release/herodb --port 6379 --encrypt --key secret123 ./target/release/herodb --port 6381 --sled --encrypt --key secret123 # Both support the same Redis commands redis-cli -p 6379 HSET user:1 name "Alice" age "30" redis-cli -p 6381 HSET user:1 name "Alice" age "30" # Both support SCAN operations redis-cli -p 6379 SCAN 0 MATCH user:* COUNT 10 redis-cli -p 6381 SCAN 0 MATCH user:* COUNT 10 ``` ### Migration Between Backends To migrate data between backends, use Redis replication or dump/restore: ```bash # Export from redb redis-cli -p 6379 --rdb dump.rdb # Import to sled redis-cli -p 6381 --pipe < dump.rdb ```