答案: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(string key, Func 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 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(string key, T value, TimeSpan? expiry = null)
{
var json = JsonSerializer.Serialize(value);
await _cache.SetStringAsync(key, json, new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = expiry
});
}
public async Task GetObjectAsync(string key)
{
var json = await _cache.GetStringAsync(key);
return json == null ? default : JsonSerializer.Deserialize(json);
}
3. 缓存策略设计建议
实际项目中应根据业务需求选择合适的缓存层级与更新机制。
缓存穿透:对不存在的数据做空值缓存,并设置较短过期时间。 缓存击穿:热点数据过期时可能引发大量请求打到数据库,可用互斥锁(如 Redis 的 SETNX)控制重建。 缓存雪崩:避免大量缓存同时失效,可为过期时间增加随机偏移。 双写一致性:更新数据库后及时清除或更新缓存,推荐“先更新 DB,再删缓存”策略。
可封装通用缓存接口,支持运行时切换实现:
public interface IAppCache
{
Task GetOrCreateAsync(string key, Func> factory, TimeSpan? expiry = null);
Task RemoveAsync(string key);
}
分别用 MemoryCache 和 Redis 实现该接口,便于后期扩展。
基本上就这些。MemoryCache 简单高效,适合本地缓存;Redis 功能强大,支撑分布式架构。根据场景灵活选择,才能发挥最大价值。
以上就是C#如何实现缓存策略?内存缓存(MemoryCache)与分布式缓存(Redis)实战的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1442122.html
微信扫一扫
支付宝扫一扫