一、C#对接 Redis 环境搭建
1. 安装依赖包
2. 通用连接助手类
using StackExchange.Redis;using System;/// <summary>/// Redis 连接助手(单例模式)/// </summary>public static class RedisHelper{ // 连接字符串(替换为你的Redis地址) private static readonly string _connectionString = "127.0.0.1:6379,password=123456"; private static readonly Lazy<ConnectionMultiplexer> _lazyConnection; static RedisHelper() { _lazyConnection = new Lazy<ConnectionMultiplexer>(() => { return ConnectionMultiplexer.Connect(_connectionString); }); } // 获取Redis连接实例 public static ConnectionMultiplexer Connection => _lazyConnection.Value; // 获取数据库操作对象 public static IDatabase GetDatabase() => Connection.GetDatabase();}
二、高并发核心:Redis 缓存策略实战
1. 标准缓存读写模型(防穿透)
/// <summary>/// 获取商品详情(带缓存,防穿透)/// </summary>public async Task<GoodsDto> GetGoodsInfoAsync(int goodsId){ var redis = RedisHelper.GetDatabase(); string cacheKey = $"goods:info:{goodsId}"; // 1. 先查Redis缓存 var cacheData = await redis.StringGetAsync(cacheKey); if (cacheData.HasValue) { // 空值缓存(防缓存穿透:避免不存在的ID反复查库) if (cacheData == "null") return null; return JsonSerializer.Deserialize<GoodsDto>(cacheData); } // 2. 缓存未命中,查询数据库 var dbData = await _goodsRepository.GetByIdAsync(goodsId); // 3. 写入Redis(空数据也缓存,设置短过期时间) var expireTime = dbData == null ? TimeSpan.FromMinutes(1) : TimeSpan.FromHours(2); await redis.StringSetAsync(cacheKey, dbData == null ? "null" : JsonSerializer.Serialize(dbData), expireTime); return dbData;}
2. 三大缓存问题防护总结
•缓存穿透:查询不存在的数据,缓存空值 + 布隆过滤器
•缓存击穿:热点 Key 过期,互斥锁 / 永不过期
•缓存雪崩:大量 Key 同时过期,随机过期时间 + 集群部署
三、高并发核心:Redis 分布式锁实战
单机锁在分布式部署(多服务器)下失效,会导致超卖、重复提交、数据覆盖,Redis 分布式锁是最优解决方案。
1. 加锁 + 解锁完整实现(防死锁、防误删)
/// <summary>/// Redis分布式锁(秒杀/订单防重复专用)/// </summary>public async Task<bool> CreateOrderAsync(int userId, int goodsId){ var redis = RedisHelper.GetDatabase(); string lockKey = $"lock:order:{goodsId}"; string requestId = Guid.NewGuid().ToString(); // 唯一标识,防误删 TimeSpan lockExpire = TimeSpan.FromSeconds(10); // 锁超时时间 try { // 1. 加锁(仅不存在时加锁,SETNX) bool lockSuccess = await redis.LockTakeAsync(lockKey, requestId, lockExpire); if (!lockSuccess) { Console.WriteLine("请求频繁,请稍后再试!"); return false; } // 2. 执行业务逻辑(库存扣减、创建订单) var stock = await ReduceStockAsync(goodsId); if (!stock) return false; await _orderRepository.AddAsync(new Order { UserId = userId, GoodsId = goodsId }); return true; } finally { // 3. 解锁(仅自己加的锁能删,防误删) await redis.LockReleaseAsync(lockKey, requestId); }}
2. 分布式锁核心要点
•必须设置过期时间,防止服务宕机导致死锁
•加锁 + 解锁必须用唯一标识,避免误删他人锁
•高可用场景:使用 RedLock 红锁,防止 Redis 节点宕机丢锁
四、落地价值
1.接口性能提升10~100 倍,数据库压力直线下降
2.彻底解决分布式场景下的超卖、重复提交、数据不一致
3.适配电商、支付、直播、高频查询等所有高并发场景
文末福利:C#Redis 实战资料包免费领!
总结
1.C#对接 Redis 首选StackExchange.Redis,单例连接是最优实践
2.缓存策略核心:空值缓存、随机过期、热点永不过期
3.分布式锁核心:唯一标识 + 自动过期,杜绝死锁、误删、超卖
4.全套实战资料后台回复【Redis 实战】免费领取,直接落地业务