Redis 客户端 for C# (.NET): StackExchange.Redis

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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 的优势



  • 高性能

推荐