Skip to content

Redis

Redis provides lowest latency for high-throughput scenarios where some durability trade-offs are acceptable.


StrengthBenefit
Sub-millisecond latencyFastest event writes
Horizontal scalingRedis Cluster for partitioning
Memory-firstNo disk I/O on hot path
Pub/Sub nativeCan double as event bus

ConcernConsideration
DurabilityConfigurable (AOF, RDB, none)
Memory costEvents live in RAM until evicted
ComplexityCluster mode adds operational overhead

[storage]
backend = "redis"
[storage.redis]
url = "redis://localhost:6379"
# For cluster mode
# urls = ["redis://node1:6379", "redis://node2:6379"]
Terminal window
export REDIS_URL="redis://localhost:6379"
export STORAGE_BACKEND="redis"

Redis stores events in sorted sets keyed by aggregate:

events:{domain}:{edition}:{root}
└── ZADD with sequence as score
└── Member: serialized event
positions:{handler}:{domain}:{edition}:{root}
└── String: sequence number
snapshots:{domain}:{edition}:{root}
└── Hash: { sequence, state }

redis.conf
appendonly yes
appendfsync everysec # fsync every second (default)
# appendfsync always # fsync every write (slower, safest)
redis.conf
save 900 1 # Save if 1 key changed in 900 seconds
save 300 10 # Save if 10 keys changed in 300 seconds
save 60 10000 # Save if 10000 keys changed in 60 seconds

Use both AOF and RDB for durability with fast recovery:

appendonly yes
appendfsync everysec
save 900 1

values.yaml
storage:
backend: redis
redis:
enabled: true
host: redis.cache.svc.cluster.local
port: 6379
credentials:
secretName: redis-credentials
passwordKey: password

Terminal window
# Run Redis tests (requires testcontainers)
cargo test --test storage_redis --features redis
# Requires podman socket
systemctl --user start podman.socket

  • Gaming/real-time — Latency-critical applications
  • Ephemeral data — Acceptable to lose on crash
  • Caching layer — In front of durable storage
  • Development — Fast iteration without disk I/O