C#如何实现缓存策略?内存缓存(MemoryCache)与分布式缓存(Redis)实战

星降
发布: 2025-11-24 10:24:38
原创
891人浏览过
答案:C#中通过MemoryCache实现本地缓存、Redis实现分布式缓存,结合缓存穿透、击穿、雪崩防护策略及双写一致性设计,提升系统性能。

c#如何实现缓存策略?内存缓存(memorycache)与分布式缓存(redis)实战

在C#开发中,缓存是提升系统性能的关键手段。合理使用缓存可以减少数据库压力、加快响应速度。常见的缓存策略主要分为两类:内存缓存和分布式缓存。下面结合实战讲解如何在.NET项目中使用 MemoryCacheRedis 实现高效的缓存机制。

1. 内存缓存 MemoryCache 的使用

MemoryCache 是 .NET 提供的本地内存缓存实现,适用于单机部署场景,读写速度快,但不具备进程间共享能力。

基本用法:

  • 通过 NuGet 安装 Microsoft.Extensions.Caching.Memory 包。
  • Program.csStartup.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 是更合适的选择。它支持高并发、持久化和跨服务器共享缓存。

集成步骤:

MakeSong
MakeSong

AI音乐生成,生成高质量音乐,仅需30秒的时间

MakeSong 145
查看详情 MakeSong
  • 安装 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中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号