答案:C#中通过MemoryCache实现本地缓存、Redis实现分布式缓存,结合缓存穿透、击穿、雪崩防护策略及双写一致性设计,提升系统性能。

在C#开发中,缓存是提升系统性能的关键手段。合理使用缓存可以减少数据库压力、加快响应速度。常见的缓存策略主要分为两类:内存缓存和分布式缓存。下面结合实战讲解如何在.NET项目中使用 MemoryCache 和 Redis 实现高效的缓存机制。
1. 内存缓存 MemoryCache 的使用
MemoryCache 是 .NET 提供的本地内存缓存实现,适用于单机部署场景,读写速度快,但不具备进程间共享能力。
基本用法:
- 通过 NuGet 安装 Microsoft.Extensions.Caching.Memory 包。
- 在
Program.cs 或 Startup.cs 中注册服务:
builder.Services.AddMemoryCache();
创建一个缓存服务类:
public class InMemoryCacheService
{
private readonly IMemoryCache _cache;
public InMemoryCacheService(IMemoryCache cache)
{
_cache = cache;
}
public T GetOrCreate<T>(string key, Func<ICacheEntry, T> factory)
{
return _cache.GetOrCreate(key, factory);
}
public void Remove(string key)
{
_cache.Remove(key);
}
}
使用示例:缓存用户数据
var user = _memoryCache.GetOrCreate("user_123", entry =>
{
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10);
return _userRepository.GetById(123);
});
支持设置过期时间(绝对或滑动)、优先级、回调等策略。
2. 分布式缓存 Redis 的集成
当应用部署在多个实例或需要共享状态时,Redis 是更合适的选择。它支持高并发、持久化和跨服务器共享缓存。
集成步骤:
- 安装 StackExchange.Redis 或使用 Microsoft.Extensions.Caching.StackExchangeRedis。
- 在
Program.cs 中添加 Redis 缓存:
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost:6379";
options.InstanceName = "sample_";
});
注入 IDistributedCache 接口进行操作:
public class RedisCacheService
{
private readonly IDistributedCache _cache;
public RedisCacheService(IDistributedCache cache)
{
_cache = cache;
}
public async Task<string> GetStringAsync(string key)
{
return await _cache.GetStringAsync(key);
}
public async Task SetStringAsync(string key, string value, TimeSpan? expiry = null)
{
await _cache.SetStringAsync(key, value, new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = expiry ?? TimeSpan.FromMinutes(20)
});
}
}
对于复杂对象,可结合 System.Text.Json 序列化存储:
public async Task SetObjectAsync<T>(string key, T value, TimeSpan? expiry = null)
{
var json = JsonSerializer.Serialize(value);
await _cache.SetStringAsync(key, json, new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = expiry
});
}
public async Task<T> GetObjectAsync<T>(string key)
{
var json = await _cache.GetStringAsync(key);
return json == null ? default : JsonSerializer.Deserialize<T>(json);
}
3. 缓存策略设计建议
实际项目中应根据业务需求选择合适的缓存层级与更新机制。
-
缓存穿透:对不存在的数据做空值缓存,并设置较短过期时间。
-
缓存击穿:热点数据过期时可能引发大量请求打到数据库,可用互斥锁(如 Redis 的 SETNX)控制重建。
-
缓存雪崩:避免大量缓存同时失效,可为过期时间增加随机偏移。
-
双写一致性:更新数据库后及时清除或更新缓存,推荐“先更新 DB,再删缓存”策略。
可封装通用缓存接口,支持运行时切换实现:
public interface IAppCache
{
Task<T> GetOrCreateAsync<T>(string key, Func<Task<T>> factory, TimeSpan? expiry = null);
Task RemoveAsync(string key);
}
分别用 MemoryCache 和 Redis 实现该接口,便于后期扩展。
基本上就这些。MemoryCache 简单高效,适合本地缓存;Redis 功能强大,支撑分布式架构。根据场景灵活选择,才能发挥最大价值。
以上就是C#如何实现缓存策略?内存缓存(MemoryCache)与分布式缓存(Redis)实战的详细内容,更多请关注php中文网其它相关文章!