在C#项目中操作Redis可以有效提升数据读取效率,降低数据库访问压力,是后端开发中非常实用的技能。下面将从环境准备到具体操作逐步讲解完整流程。

环境准备
首先需要安装Redis的C#客户端依赖,目前最常用的是StackExchange.Redis包,可以通过NuGet包管理器安装,也可以在项目文件里添加包引用。
如果使用NuGet控制台安装,执行以下命令:
Install-Package StackExchange.Redis
如果是.NET Core项目,也可以在csproj文件中添加如下配置:
<PackageReference Include="StackExchange.Redis" Version="2.6.122" />
建立Redis连接
StackExchange.Redis通过ConnectionMultiplexer类管理Redis连接,它是线程安全的,整个应用生命周期内只需要创建一个实例即可。
基础连接配置
连接Redis需要指定服务器地址、端口、密码等信息,以下是基础连接示例代码:
using StackExchange.Redis;
using System;
class RedisHelper
{
// 单例连接对象,避免重复创建连接
private static ConnectionMultiplexer _connection;
private static readonly object _lockObj = new object();
// Redis连接字符串,根据实际环境修改
private static string _redisConnectionString = "127.0.0.1:6379,password=your_redis_password,defaultDatabase=0";
/// <summary>
/// 获取Redis连接实例
/// </summary>
public static ConnectionMultiplexer GetConnection()
{
if (_connection == null || !_connection.IsConnected)
{
lock (_lockObj)
{
if (_connection == null || !_connection.IsConnected)
{
_connection = ConnectionMultiplexer.Connect(_connectionString);
}
}
}
return _connection;
}
/// <summary>
/// 获取指定数据库的实例
/// </summary>
/// <param name="dbIndex">数据库索引,默认0</param>
public static IDatabase GetDatabase(int dbIndex = 0)
{
return GetConnection().GetDatabase(dbIndex);
}
}
连接字符串参数说明
连接字符串支持多个配置参数,常用参数如下:
| 参数名 | 说明 | 示例 |
|---|---|---|
| host:port | Redis服务器地址和端口 | 127.0.0.1:6379 |
| password | Redis访问密码,无密码可不填 | password=123456 |
| defaultDatabase | 默认使用的数据库索引,Redis默认有16个库 | defaultDatabase=0 |
| connectTimeout | 连接超时时间,单位毫秒 | connectTimeout=5000 |
| syncTimeout | 同步操作超时时间,单位毫秒 | syncTimeout=5000 |
基础数据类型操作
Redis支持字符串、哈希、列表、集合、有序集合等常用数据类型,下面分别介绍C#中操作这些数据类型的示例。
字符串(String)操作
字符串是最基础的数据类型,适合存储简单的键值对数据,比如用户会话、配置信息等。
using StackExchange.Redis;
using System;
class StringDemo
{
static void Main()
{
IDatabase db = RedisHelper.GetDatabase();
string key = "user:1001:name";
// 设置字符串值,过期时间设置为30分钟
bool setResult = db.StringSet(key, "张三", TimeSpan.FromMinutes(30));
Console.WriteLine($"设置结果:{setResult}");
// 获取字符串值
string value = db.StringGet(key);
Console.WriteLine($"获取到的值:{value}");
// 自增操作,适合计数器场景
string countKey = "article:1001:view_count";
long newCount = db.StringIncrement(countKey);
Console.WriteLine($"自增后的计数:{newCount}");
// 删除键
bool deleteResult = db.KeyDelete(key);
Console.WriteLine($"删除结果:{deleteResult}");
}
}
哈希(Hash)操作
哈希类型适合存储对象类数据,比如用户信息、商品信息等,可以单独操作对象的某个字段。
using StackExchange.Redis;
using System.Collections.Generic;
class HashDemo
{
static void Main()
{
IDatabase db = RedisHelper.GetDatabase();
string hashKey = "user:1002";
// 设置单个哈希字段
db.HashSet(hashKey, "name", "李四");
db.HashSet(hashKey, "age", 25);
db.HashSet(hashKey, "email", "lisi@ipipp.com");
// 批量设置哈希字段
var hashFields = new HashEntry[]
{
new HashEntry("phone", "13800138000"),
new HashEntry("address", "北京市朝阳区")
};
db.HashSet(hashKey, hashFields);
// 获取单个哈希字段值
string name = db.HashGet(hashKey, "name");
Console.WriteLine($"用户姓名:{name}");
// 获取所有哈希字段和值
HashEntry[] allFields = db.HashGetAll(hashKey);
foreach (var field in allFields)
{
Console.WriteLine($"{field.Name}:{field.Value}");
}
// 删除哈希中的指定字段
db.HashDelete(hashKey, "phone");
}
}
列表(List)操作
列表类型是有序的字符串集合,适合实现队列、栈等数据结构,比如消息队列、最新消息列表等场景。
using StackExchange.Redis;
using System;
class ListDemo
{
static void Main()
{
IDatabase db = RedisHelper.GetDatabase();
string listKey = "message:queue";
// 从列表左侧插入元素(栈结构)
db.ListLeftPush(listKey, "消息1");
db.ListLeftPush(listKey, "消息2");
db.ListLeftPush(listKey, "消息3");
// 获取列表长度
long length = db.ListLength(listKey);
Console.WriteLine($"列表长度:{length}");
// 从列表右侧取出元素(队列结构,先进先出)
for (int i = 0; i < length; i++)
{
string message = db.ListRightPop(listKey);
Console.WriteLine($"取出消息:{message}");
}
// 获取列表范围内的元素
db.ListLeftPush(listKey, "元素1");
db.ListLeftPush(listKey, "元素2");
db.ListLeftPush(listKey, "元素3");
RedisValue[] rangeValues = db.ListRange(listKey, 0, 1); // 获取前两个元素
foreach (var item in rangeValues)
{
Console.WriteLine($"列表元素:{item}");
}
}
}
实际开发注意事项
ConnectionMultiplexer是线程安全的,不要每次操作都创建新的连接实例,否则会造成连接资源浪费,甚至触发Redis的连接数上限。- 操作Redis时建议添加异常处理,避免Redis服务不可用导致整个应用崩溃,尤其是生产环境。
- 合理设置键的过期时间,避免无用数据长期占用Redis内存,尤其是临时数据、会话类数据。
- 如果操作频繁,可以考虑使用连接池或者复用
IDatabase实例,减少重复获取的开销。 - 批量操作尽量使用Redis的事务或者管道(Pipeline)功能,减少网络往返次数,提升操作效率。
事务操作示例
如果需要保证多个操作的原子性,可以使用Redis的事务功能,以下是事务操作示例:
using StackExchange.Redis;
using System;
class TransactionDemo
{
static void Main()
{
IDatabase db = RedisHelper.GetDatabase();
string key1 = "trans:key1";
string key2 = "trans:key2";
// 创建事务对象
ITransaction transaction = db.CreateTransaction();
// 添加事务内的操作
transaction.AddCondition(Condition.KeyNotExists(key1)); // 条件:key1不存在时才执行
transaction.StringSetAsync(key1, "value1");
transaction.StringSetAsync(key2, "value2");
// 执行事务
bool executeResult = transaction.Execute();
Console.WriteLine($"事务执行结果:{executeResult}");
// 验证结果
if (executeResult)
{
Console.WriteLine($"key1的值:{db.StringGet(key1)}");
Console.WriteLine($"key2的值:{db.StringGet(key2)}");
}
}
}
C#RedisStackExchange_Redis缓存操作连接配置修改时间:2026-07-05 13:27:37