Redis Data Structures
Leverage Redis data structures for efficient caching and messaging.
A Simple Analogy
Redis data structures are like different types of containers. Strings for simple values, lists for queues, sets for uniqueness.
Why Structures?
- Optimization: Right tool for each use case
- Performance: Operations optimized per type
- Flexibility: Different access patterns
- Efficiency: Memory-efficient storage
- Operations: Built-in operations per type
Strings
var redis = ConnectionMultiplexer.Connect("localhost:6379");
var db = redis.GetDatabase();
// Set/Get
db.StringSet("user:1:name", "Alice");
var name = db.StringGet("user:1:name");
// Increment
db.StringIncrement("page:views");
var views = db.StringGet("page:views");
// Expiration
db.StringSet("session:123", "token-abc", TimeSpan.FromHours(1));
Lists (Queues)
// Push/Pop
db.ListRightPush("tasks", "task-1");
db.ListRightPush("tasks", "task-2");
var task = db.ListLeftPop("tasks"); // FIFO
// Get range
var allTasks = db.ListRange("tasks", 0, -1);
// Length
var count = db.ListLength("tasks");
// Use case: Job queue
db.ListRightPush("queue:jobs", JsonConvert.SerializeObject(job));
var nextJob = db.ListLeftPop("queue:jobs");
Sets (Unique Items)
// Add/Remove
db.SetAdd("user:1:tags", "csharp");
db.SetAdd("user:1:tags", "azure");
db.SetAdd("user:1:tags", "csharp"); // Duplicate, ignored
// Get all
var tags = db.SetMembers("user:1:tags");
// Check membership
var hasCsharp = db.SetContains("user:1:tags", "csharp");
// Set operations
db.SetAdd("user:2:tags", "csharp");
db.SetAdd("user:2:tags", "devops");
var commonTags = db.SetCombine(SetOperation.Intersect,
"user:1:tags", "user:2:tags");
Hashes (Objects)
// Set fields
db.HashSet("user:1", new HashEntry[] {
new HashEntry("name", "Alice"),
new HashEntry("email", "alice@example.com"),
new HashEntry("age", "30")
});
// Get field
var name = db.HashGet("user:1", "name");
// Get all
var user = db.HashGetAll("user:1");
foreach (var entry in user)
{
Console.WriteLine($"{entry.Name}: {entry.Value}");
}
// Increment
db.HashIncrement("user:1", "posts", 1);
Sorted Sets (Leaderboards)
// Add with score
db.SortedSetAdd("leaderboard", "alice", 1050);
db.SortedSetAdd("leaderboard", "bob", 950);
db.SortedSetAdd("leaderboard", "charlie", 1200);
// Get top 3
var top3 = db.SortedSetRangeByRankWithScores("leaderboard", 0, 2, Order.Descending);
foreach (var entry in top3)
{
Console.WriteLine($"{entry.Element}: {entry.Score}");
}
// Rank
var rank = db.SortedSetRank("leaderboard", "alice");
Best Practices
- Right structure: Match your access pattern
- Expiration: Set TTLs to prevent memory bloat
- Naming: Use consistent key naming (user:ID:field)
- Atomic: Use Lua scripts for multi-step operations
- Monitoring: Track memory usage
Related Concepts
- Caching strategies
- Pub/Sub messaging
- Redis Streams
- Cluster mode
Summary
Redis provides optimized data structures for different use cases: strings for values, lists for queues, sets for uniqueness, hashes for objects.
Related Articles
Azure Cosmos DB with ASP.NET Core
Build globally distributed applications with Azure Cosmos DB.
Read More databaseData Migration Strategies
Plan and execute safe database migrations in production.
Read More databaseDatabase Indexing Fundamentals
Learn how database indexing improves query performance significantly.
Read More