Redis Storage Provider
Ultra-fast in-memory caching with real-time notifications and streaming capabilities.
Lightning Fast Performance
Sub-ms LatencyAuto ChunkingPub/Sub EventsRedis StreamsCluster Support
Installation
dotnet add package Zetian
dotnet add package Zetian.Storage.RedisQuick Start
QuickStart.cs
using Zetian.Server;
using Zetian.Storage.Redis.Extensions;
// Basic Redis cache setup
var server = new SmtpServerBuilder()
.Port(25)
.WithRedisStorage("localhost:6379")
.Build();
await server.StartAsync();Advanced Configuration
AdvancedConfig.cs
var server = new SmtpServerBuilder()
.Port(25)
.WithRedisStorage(
"localhost:6379,password=secret,ssl=false",
config =>
{
config.DatabaseNumber = 1;
config.KeyPrefix = "smtp:msg:";
// TTL for auto-expiration
config.MessageTTLSeconds = 3600; // 1 hour
// Chunking for large messages
config.EnableChunking = true;
config.ChunkSizeKB = 64;
// Real-time features
config.UseRedisStreams = true;
config.StreamKey = "smtp:events";
config.EnablePubSub = true;
config.PubSubChannel = "smtp:notifications";
// Indexing
config.MaintainIndex = true;
config.IndexKey = "smtp:index";
// Compression
config.CompressMessageBody = true;
})
.Build();Automatic Chunking
Large messages are automatically split into manageable chunks:
Chunking.cs
// Large messages are automatically split into chunks
// This prevents Redis memory fragmentation
// Message stored as:
// smtp:msg:123456 -> metadata
// smtp:msg:123456:chunk:0 -> first 64KB
// smtp:msg:123456:chunk:1 -> second 64KB
// smtp:msg:123456:chunk:2 -> third 64KB
// Retrieval automatically reassembles chunks
var fullMessage = await store.GetMessageAsync(messageId);Smart Splitting
Configurable chunk size
Auto Assembly
Transparent to client
Memory Efficient
Prevents fragmentation
Real-time Pub/Sub
Get instant notifications when messages arrive:
PubSub.cs
// Real-time notifications with Pub/Sub
var subscriber = redis.GetSubscriber();
// Subscribe to message events
await subscriber.SubscribeAsync("smtp:notifications", (channel, value) =>
{
var notification = JsonSerializer.Deserialize<MessageNotification>(value);
Console.WriteLine($"New message: {notification.MessageId} from {notification.From}");
});
// Publish notification (done automatically by storage)
await subscriber.PublishAsync("smtp:notifications", JsonSerializer.Serialize(new
{
Event = "message_received",
MessageId = "ABC123",
From = "[email protected]",
Timestamp = DateTime.UtcNow
}));Redis Streams
Event sourcing with Redis Streams:
Streams.sh
// Redis Streams for event sourcing
// Automatically creates event stream
XADD smtp:events * event message_received id ABC123 from [email protected]
XADD smtp:events * event message_stored id ABC123 size 45678
XADD smtp:events * event message_deleted id ABC123
// Read stream events
XREAD STREAMS smtp:events 0
// Consumer groups for processing
XGROUP CREATE smtp:events processors $
XREADGROUP GROUP processors consumer1 STREAMS smtp:events >Configuration Options
| Option | Default | Description |
|---|---|---|
| DatabaseNumber | 0 | Redis database (0-15) |
| KeyPrefix | "smtp:" | Key namespace prefix |
| MessageTTLSeconds | 3600 | Message expiration time |
| EnableChunking | true | Split large messages |
| ChunkSizeKB | 64 | Chunk size in KB |
| UseRedisStreams | false | Enable Redis Streams |
| EnablePubSub | false | Enable Pub/Sub events |
When to Use Redis
✅ Perfect For
- • Recent message cache
- • Real-time notifications
- • Temporary message queue
- • High-frequency access patterns
- • Session storage
⚠️ Consider Alternatives
- • Long-term archival
- • Very large attachments
- • Complex queries needed
- • Persistent storage required
- • Limited memory available
Performance Tips
•
Use TTL for automatic cleanup
Prevents memory bloat
•
Enable connection pooling
Reuse connections for better performance
•
Consider Redis Cluster for scaling
Horizontal scaling for high loads
•
Use pipelining for batch operations
Reduce network round-trips