在C#项目里操作Redis数据库,StackExchange.Redis是最主流的客户端库,它支持同步异步操作、连接池管理,适配Redis的大部分功能特性,能满足大部分业务场景的缓存、数据存储需求。

环境准备与库引入
首先需要安装StackExchange.Redis包,在Visual Studio的NuGet包管理器中搜索StackExchange.Redis安装,或者通过命令行执行安装命令:
// 使用NuGet命令行安装 Install-Package StackExchange.Redis
建立Redis连接
StackExchange.Redis推荐使用单例模式管理连接对象,避免频繁创建销毁连接带来的性能损耗,核心是通过ConnectionMultiplexer类建立连接:
using StackExchange.Redis;
using System;
public class RedisHelper
{
// 单例连接对象
private static ConnectionMultiplexer _connection;
// Redis连接字符串,根据实际环境修改地址端口和密码
private static readonly string RedisConnectionString = "127.0.0.1:6379,password=,abortConnect=false";
/// <summary>
/// 获取Redis连接实例
/// </summary>
public static ConnectionMultiplexer GetConnection()
{
if (_connection == null || !_connection.IsConnected)
{
_connection = ConnectionMultiplexer.Connect(RedisConnectionString);
}
return _connection;
}
/// <summary>
/// 获取数据库实例
/// </summary>
public static IDatabase GetDatabase(int dbIndex = 0)
{
return GetConnection().GetDatabase(dbIndex);
}
}
连接字符串中abortConnect=false表示初始连接失败时不要抛出异常,继续尝试重连,适合Redis服务可能临时不可用的场景。
基础数据类型操作
字符串类型操作
字符串是Redis最基础的数据类型,支持设置、获取、过期时间设置等操作:
using StackExchange.Redis;
using System;
class Program
{
static void Main()
{
IDatabase db = RedisHelper.GetDatabase();
// 设置字符串键值,过期时间设置为30秒
bool setResult = db.StringSet("user:name", "张三", TimeSpan.FromSeconds(30));
Console.WriteLine($"设置结果:{setResult}");
// 获取字符串值
string userName = db.StringGet("user:name");
Console.WriteLine($"获取到的用户名:{userName}");
// 数值自增操作
db.StringSet("visit:count", 0);
long newCount = db.StringIncrement("visit:count");
Console.WriteLine($"自增后的访问量:{newCount}");
}
}
哈希类型操作
哈希类型适合存储对象类的结构化数据,比如用户信息、商品属性等:
using StackExchange.Redis;
using System.Collections.Generic;
class Program
{
static void Main()
{
IDatabase db = RedisHelper.GetDatabase();
string hashKey = "user:1001";
// 批量设置哈希字段
var hashFields = new HashEntry[]
{
new HashEntry("id", 1001),
new HashEntry("name", "李四"),
new HashEntry("age", 25),
new HashEntry("email", "test@ipipp.com")
};
db.HashSet(hashKey, hashFields);
// 获取单个哈希字段
string userName = db.HashGet(hashKey, "name");
Console.WriteLine($"用户姓名:{userName}");
// 获取所有哈希字段和值
HashEntry[] allFields = db.HashGetAll(hashKey);
foreach (var item in allFields)
{
Console.WriteLine($"{item.Name}:{item.Value}");
}
// 判断哈希字段是否存在
bool hasAge = db.HashExists(hashKey, "age");
Console.WriteLine($"是否存在年龄字段:{hasAge}");
}
}
列表类型操作
列表类型是有序的字符串集合,支持从两端插入、弹出元素,适合做消息队列、时间线列表等场景:
using StackExchange.Redis;
using System;
class Program
{
static void Main()
{
IDatabase db = RedisHelper.GetDatabase();
string listKey = "task:queue";
// 从列表左侧插入元素
db.ListLeftPush(listKey, "任务1");
db.ListLeftPush(listKey, "任务2");
db.ListLeftPush(listKey, "任务3");
// 获取列表长度
long listLength = db.ListLength(listKey);
Console.WriteLine($"列表长度:{listLength}");
// 从列表右侧弹出元素
string task = db.ListRightPop(listKey);
Console.WriteLine($"弹出的任务:{task}");
// 获取列表所有元素
RedisValue[] allTasks = db.ListRange(listKey, 0, -1);
Console.WriteLine("剩余任务列表:");
foreach (var item in allTasks)
{
Console.WriteLine(item);
}
}
}
发布订阅功能使用
StackExchange.Redis也支持Redis的发布订阅功能,可以实现消息广播、事件通知等需求:
using StackExchange.Redis;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
ConnectionMultiplexer connection = RedisHelper.GetConnection();
ISubscriber subscriber = connection.GetSubscriber();
// 订阅频道
await subscriber.SubscribeAsync("news:channel", (channel, message) =>
{
Console.WriteLine($"收到频道{channel}的消息:{message}");
});
// 发布消息
await subscriber.PublishAsync("news:channel", "系统更新通知");
Console.ReadLine();
}
}
注意事项
- 连接对象要复用,不要每次操作都创建新的
ConnectionMultiplexer,否则会导致连接数耗尽。 - 操作完成后不需要手动关闭连接,
ConnectionMultiplexer会自动管理连接生命周期。 - 异步操作尽量使用对应的Async方法,避免阻塞主线程,提升程序性能。
- 如果Redis设置了密码,要在连接字符串中正确配置,否则会连接失败。
- 操作键值前可以先判断是否存在,避免不必要的异常,比如用
db.KeyExists(key)方法检查键是否存在。
C#StackExchange_RedisRedis操作数据库操作修改时间:2026-07-01 18:51:48