在实际的 C# 后端开发中,很多项目在用户量增长之后,最容易遇到的问题就是:
-
接口响应越来越慢
-
数据库压力越来越大
-
页面加载卡顿
-
高并发时接口直接超时
这些问题的核心原因往往是:所有请求都直接访问数据库。
解决这类问题最有效的方法之一就是 引入 Redis 缓存机制。本文将通过一个完整的实战案例,讲解如何在 C# 项目中使用 Redis 来优化接口性能。
一、为什么接口会变慢?
先看一个典型的接口逻辑:
[HttpGet]
public async Task<UserDto> GetUser(int id)
{
var user = await _userRepository.GetByIdAsync(id);
return user;
}
当访问量不高时,这种写法没有问题。
但如果接口访问量变大,比如:
-
每秒 500 次请求
-
每次都访问数据库
数据库就会出现:
-
查询压力暴增
-
CPU占用过高
-
连接池耗尽
最终导致接口越来越慢。
二、Redis 缓存的作用
Redis 是一种 高性能的内存数据库,读取速度远远快于传统数据库。
典型访问流程:
没有缓存
用户请求
↓
接口
↓
数据库
↓
返回数据
加入 Redis 缓存
用户请求
↓
接口
↓
Redis(有数据)
↓
直接返回
只有缓存不存在时才访问数据库:
用户请求
↓
接口
↓
Redis(没有)
↓
数据库
↓
写入Redis
↓
返回数据
这样可以大幅减少数据库访问次数。
三、C#项目接入 Redis
常用 Redis 客户端:
StackExchange.Redis
安装 NuGet:
StackExchange.Redis
四、配置 Redis 连接
创建 Redis 连接类:
using StackExchange.Redis;
public class RedisHelper
{
private static ConnectionMultiplexer redis;
public static ConnectionMultiplexer GetConnection()
{
if (redis == null)
{
redis = ConnectionMultiplexer.Connect("localhost:6379");
}
return redis;
}
}
获取数据库实例:
var db = RedisHelper.GetConnection().GetDatabase();
五、接口缓存实战
假设有一个用户查询接口:
[HttpGet]
public async Task<UserDto> GetUser(int id)
{
var db = RedisHelper.GetConnection().GetDatabase();
string cacheKey = $"user:{id}";
var cache = await db.StringGetAsync(cacheKey);
if (!cache.IsNullOrEmpty)
{
return JsonConvert.DeserializeObject<UserDto>(cache);
}
var user = await _userRepository.GetByIdAsync(id);
await db.StringSetAsync(cacheKey, JsonConvert.SerializeObject(user), TimeSpan.FromMinutes(10));
return user;
}
执行流程:
1️⃣ 先查询 Redis
2️⃣ 如果有数据直接返回
3️⃣ 没有则查询数据库
4️⃣ 同时写入 Redis
六、缓存优化技巧
1 缓存过期时间
设置合理过期时间:
await db.StringSetAsync(key, value, TimeSpan.FromMinutes(10));
避免缓存永久存在导致数据不一致。
2 防止缓存穿透
缓存穿透指:
查询的数据 数据库和缓存都不存在。
解决方案:
即使数据不存在也缓存:
if (user == null)
{
await db.StringSetAsync(cacheKey, "null", TimeSpan.FromMinutes(2));
}
3 防止缓存击穿
热点数据在同一时间过期,大量请求同时访问数据库。
解决方案:
-
设置随机过期时间
var expire = TimeSpan.FromMinutes(10 + new Random().Next(1,5));
4 使用缓存前缀
避免 key 冲突:
user:1
product:100
order:200
示例:
string cacheKey = $"user:{id}";
七、接口性能优化技巧
除了 Redis,还有一些常见优化方法。
1 使用异步接口
推荐:
public async Task<IActionResult> GetUser()
避免:
public IActionResult GetUser()
异步可以提高服务器并发能力。
2 减少数据库查询字段
避免:
SELECT * FROM Users
建议:
SELECT Id,Name FROM Users
减少数据传输。
3 分页查询
避免一次查询大量数据:
SELECT * FROM Orders
使用分页:
SELECT * FROM Orders
LIMIT 0,20
4 使用索引
高频查询字段必须加索引:
例如:
UserId
OrderId
CreateTime
否则查询速度会非常慢。
八、性能优化前后对比
优化前:
| 场景 | 响应时间 |
|---|---|
| 数据库查询 | 200ms |
| 高并发 | 500ms |
优化后:
| 场景 | 响应时间 |
|---|---|
| Redis缓存 | 5ms |
| 高并发 | 20ms |
性能提升 10~50倍。
九、总结
在 C# 后端开发中,Redis 是最重要的性能优化工具之一。
通过 Redis 缓存可以:
-
减少数据库压力
-
提高接口响应速度
-
支持高并发访问
优化思路总结:
1️⃣ 优先使用 Redis 缓存热点数据
2️⃣ 设置合理缓存过期时间
3️⃣ 防止缓存穿透和击穿
4️⃣ 接口使用异步编程
5️⃣ 优化数据库查询与索引
如果你的接口已经出现:
-
响应慢
-
并发低
-
数据库压力大
那么 Redis 基本是必备方案