Redis 客户端 for C# (.NET): StackExchange.Redis
在现代 .NET 平台开发中,经常需要快速的数据缓存、消息队列组织或会话管理。解决这些任务的最佳方案之一是使用 Redis——一种高性能的键值存储数据系统。为了从 C# (.NET) 与 Redis 交互,最流行且可靠的库是 StackExchange.Redis。
什么是 StackExchange.Redis?
StackExchange.Redis 是一个由 Stack Overflow 公司开发的开源客户端库。它提供了与 Redis 交互的完整功能集:从简单的 GET/SET 操作到复杂的发布/订阅(Pub/Sub)、事务和 Lua 脚本场景。该库针对多线程应用进行了优化,并支持异步操作,使其成为 C# 高负载服务的理想选择。
安装
您可以通过 NuGet 包管理器安装该库。在包管理器控制台中执行以下命令:
Install-Package StackExchange.Redis或者通过 .NET CLI:
dotnet add package StackExchange.Redis安装后,您可以使用连接字符串连接到 Redis 服务器:
using StackExchange.Redis;
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379");IDatabase db = redis.GetDatabase();主要功能与代码示例
1. 基本键操作
最常见的场景是保存和获取值。字符串操作示例:
// 写入数据db.StringSet("user:1:name", "阿列克谢");db.StringSet("user:1:email", "alex@example.com");
// 读取数据string name = db.StringGet("user:1:name");string email = db.StringGet("user:1:email");
Console.WriteLine($"姓名: {name}, 邮箱: {email}");2. 哈希操作
Redis 支持“哈希”数据结构,便于存储对象:
// 写入哈希HashEntry[] user = new HashEntry[]{ new HashEntry("name", "玛丽亚"), new HashEntry("age", 28), new HashEntry("city", "莫斯科")};db.HashSet("user:2", user);
// 读取所有字段HashEntry[] loadedUser = db.HashGetAll("user:2");foreach (var entry in loadedUser){ Console.WriteLine($"{entry.Name}: {entry.Value}");}3. 带生存时间的缓存
Redis 的关键功能之一是自动删除过期数据。为键设置 TTL(生存时间):
// 缓存数据 10 分钟db.StringSet("cache:weather", "晴朗, +22°C", TimeSpan.FromMinutes(10));
// 检查生存时间TimeSpan? ttl = db.KeyTimeToLive("cache:weather");Console.WriteLine($"剩余: {ttl?.TotalSeconds} 秒");4. 发布与订阅(Pub/Sub)
实现实时消息交换。订阅者示例:
// 创建订阅者ISubscriber subscriber = redis.GetSubscriber();subscriber.Subscribe("notifications", (channel, message) =>{ Console.WriteLine($"收到通知: {message}");});
// 发布消息subscriber.Publish("notifications", "你好,世界!");5. 事务
原子性地执行多个操作:
ITransaction transaction = db.CreateTransaction();transaction.AddCondition(Condition.KeyNotExists("counter:lock"));transaction.StringSetAsync("counter:lock", "1");transaction.StringIncrementAsync("counter:value");
// 提交事务bool committed = transaction.Execute();Console.WriteLine(committed ? "事务已执行" : "已拒绝");StackExchange.Redis 的优势
- 高性能