一、今日目标
- 安装 Redis(Windows/Linux)
- 学会 StackExchange.Redis / CSRedis 二选一
- 封装 RedisHelper 通用帮助类(企业标准)
- 学会在项目中注入 + 使用缓存
- 背会 Redis 高频面试题
二、Redis 安装(超级简单)
Windows(开发用)
直接下载解压运行:https://github.com/tporadowski/redis/releases
redis-server.exe # 启动
redis-cli.exe # 客户端
Linux(部署用)
sudo apt install redis-server
systemctl start redis
systemctl enable redis
三、.NET 2 大 Redis 客户端(企业真实使用)
1. CSRedis(推荐,简单、稳定、支持高级功能)
Install-Package CSRedisCore
优点:
- 轻量、API 友好
- 支持异步、锁、哈希、列表、队列
- 支持集群、哨兵
- 企业使用率极高
2. StackExchange.Redis
Install-Package StackExchange.Redis
优点:
- 官方最主流
- 性能强
缺点:
- 容易超时、复杂
四、企业级 RedisHelper 完整封装(直接复制)
位置(DDD 规范)
cs
Infrastructure/
Commons/
Redis/
MyRedisHelper.cs
完整代码(CSRedis 版)
cs
using CSRedis;
namespace Admin.NET.Infrastructure.Commons.Redis;
/// <summary>
/// Redis 帮助类(企业通用)
/// </summary>
public class MyRedisHelper
{
private readonly CSRedisClient _redis;
public MyRedisHelper(string connectionString)
{
_redis = new CSRedisClient(connectionString);
}
#region String
public async Task SetAsync<T>(string key, T value, int expireMinutes = 60)
{
await _redis.SetAsync(key, value, expireMinutes * 60);
}
public async Task<T> GetAsync<T>(string key)
{
return await _redis.GetAsync<T>(key);
}
public async Task<bool> ExistsAsync(string key)
{
return await _redis.ExistsAsync(key);
}
public async Task<long> DeleteAsync(string key)
{
return await _redis.DelAsync(key);
}
#endregion
#region Hash
public async Task HashSetAsync<T>(string key, string field, T value)
{
await _redis.HSetAsync(key, field, value);
}
public async Task<T> HashGetAsync<T>(string key, string field)
{
return await _redis.HGetAsync<T>(key, field);
}
#endregion
#region 过期
public async Task ExpireAsync(string key, int expireMinutes)
{
await _redis.ExpireAsync(key, TimeSpan.FromMinutes(expireMinutes));
}
#endregion
}
五、Program.cs 注册(全局单例)
cs
// appsettings.json 配置
"Redis": {
"ConnectionString": "127.0.0.1:6379,password=,defaultDatabase=0"
}
// 注册 Redis
var redisConn = builder.Configuration["Redis:ConnectionString"]!;
builder.Services.AddSingleton(new MyRedisHelper(redisConn));
六、使用(Service 中注入)
cs
private readonly MyRedisHelper _redis;
public UserService(MyRedisHelper redis)
{
_redis = redis;
}
// 存缓存
await _redis.SetAsync("user:1", user, 30);
// 取缓存
var user = await _redis.GetAsync<User>("user:1");
七、高频面试题(必背,简历加分)
1. Redis 是什么?为什么快?
- 内存数据库,读写速度 10w QPS
- 单线程 + IO 多路复用
- 内存操作比数据库快 100~1000 倍
2. Redis 缓存使用场景?
- 接口缓存
- 菜单 / 权限缓存
- 登录用户信息
- 分布式锁
- 计数器、限流
- 队列
3. 缓存穿透、击穿、雪崩?
穿透:查不存在的数据 → 数据库压力大
解决方案:缓存空值、布隆过滤器
击穿:热点 Key 过期 → 大量请求打库
解决方案:互斥锁、永不过期
雪崩:大量 Key 同时过期
解决方案:随机过期时间、集群、多级缓存
4. Redis 淘汰策略
volatile-lru、allkeys-lru(企业最常用)
5. 为什么用 Redis 不用内存缓存?
- 分布式共享缓存
- 持久化
- 支持多种数据结构
- 支持多服务器共享
6. Redis 持久化
RDB(快照)、AOF(日志)
八、今日练习
- 安装 Redis
- 安装 CSRedisCore
- 封装 RedisHelper
- 在 UserService / MenuService 加入缓存
- 测试:存、取、删除、过期