在C#项目里集成Redis缓存是提升系统性能的常见方案,通过缓存高频访问的数据,可以减少数据库查询次数,加快接口响应速度。下面将从基础到进阶介绍完整的操作方式。

环境准备与依赖引入
首先需要在本地或者服务器安装Redis服务,Windows环境可以下载对应的安装包完成部署,Linux环境可以通过包管理器快速安装。之后在C#项目中引入操作Redis的常用依赖StackExchange.Redis,可以通过NuGet包管理器搜索安装,也可以在项目文件里添加对应的PackageReference配置。
安装完成后,需要先创建Redis连接对象,这是后续所有操作的基础。连接字符串需要包含Redis服务的地址、端口以及可选的密码、默认数据库编号等信息。
using StackExchange.Redis;
// 创建Redis连接
private static ConnectionMultiplexer redisConnection;
public static ConnectionMultiplexer GetRedisConnection()
{
if (redisConnection == null || !redisConnection.IsConnected)
{
// 连接字符串格式:地址:端口,password=密码,defaultDatabase=数据库编号
string redisConnectionString = "127.0.0.1:6379,password=123456,defaultDatabase=0";
redisConnection = ConnectionMultiplexer.Connect(redisConnectionString);
}
return redisConnection;
}
基础缓存操作
字符串类型缓存读写
字符串是Redis最常用的数据类型,适合存储简单的键值对数据,比如用户会话信息、配置项等。下面是字符串类型的写入、读取、删除操作示例。
using StackExchange.Redis;
using System;
public class RedisStringHelper
{
private static IDatabase redisDb = GetRedisConnection().GetDatabase();
// 写入字符串缓存,设置过期时间为30分钟
public static bool SetStringCache(string key, string value)
{
return redisDb.StringSet(key, value, TimeSpan.FromMinutes(30));
}
// 读取字符串缓存
public static string GetStringCache(string key)
{
return redisDb.StringGet(key);
}
// 删除指定缓存
public static bool DeleteCache(string key)
{
return redisDb.KeyDelete(key);
}
}
哈希类型缓存操作
哈希类型适合存储结构化的对象数据,比如用户信息、商品详情等,不需要把整个对象序列化后存储,可以直接操作单个字段。
public class RedisHashHelper
{
private static IDatabase redisDb = GetRedisConnection().GetDatabase();
// 设置哈希字段值
public static bool SetHashField(string key, string field, string value)
{
return redisDb.HashSet(key, field, value);
}
// 获取哈希字段值
public static string GetHashField(string key, string field)
{
return redisDb.HashGet(key, field);
}
// 获取整个哈希对象的所有字段和值
public static HashEntry[] GetAllHashFields(string key)
{
return redisDb.HashGetAll(key);
}
}
常见缓存场景实现
缓存穿透处理
缓存穿透是指查询不存在的数据,导致请求直接落到数据库上,大量这类请求会压垮数据库。常见的处理方式是缓存空值,同时设置较短的过期时间。
public static string GetUserInfoWithPenetrationHandle(string userId)
{
string cacheKey = $"user_info_{userId}";
string cacheValue = redisDb.StringGet(cacheKey);
// 缓存存在且不是空值标记,直接返回
if (!string.IsNullOrEmpty(cacheValue) && cacheValue != "null")
{
return cacheValue;
}
// 缓存是空值标记,说明之前查询过不存在的数据,直接返回空
if (cacheValue == "null")
{
return null;
}
// 缓存不存在,查询数据库
string dbValue = QueryUserFromDb(userId); // 假设的数据库查询方法
if (!string.IsNullOrEmpty(dbValue))
{
// 数据库存在数据,写入缓存,过期时间30分钟
redisDb.StringSet(cacheKey, dbValue, TimeSpan.FromMinutes(30));
return dbValue;
}
else
{
// 数据库不存在数据,缓存空值标记,过期时间5分钟,避免缓存穿透
redisDb.StringSet(cacheKey, "null", TimeSpan.FromMinutes(5));
return null;
}
}
缓存过期与更新
缓存需要设置合理的过期时间,避免数据长期不一致。当数据库数据更新时,需要同步更新或者删除对应的缓存,保证缓存和数据库的数据一致性。
// 更新用户信息后同步删除缓存
public static void UpdateUserInfoAndDeleteCache(string userId, string newUserInfo)
{
// 更新数据库
UpdateUserInDb(userId, newUserInfo); // 假设的数据库更新方法
// 删除对应的缓存
string cacheKey = $"user_info_{userId}";
redisDb.KeyDelete(cacheKey);
}
注意事项
- Redis连接对象建议使用单例模式,避免频繁创建连接消耗资源
- 缓存的过期时间需要根据业务场景合理设置,热点数据可以设置长一点,变更频繁的数据设置短一点
- 批量操作缓存时可以使用Redis的事务或者管道功能,提升操作效率
- 生产环境建议给Redis设置访问密码,避免未授权访问
实际开发中可以根据业务需求封装更通用的缓存操作类,减少重复代码,提升开发效率。
C#Redis缓存StackExchange_Redis缓存操作缓存策略修改时间:2026-07-16 05:12:26