新闻中心

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

2025-11-24
浏览次数:
返回列表
答案: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(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 是更合适的选择。它支持高并发、持久化和跨服务器共享缓存。

集成步骤:

美图云修 美图云修

商业级AI影像处理工具

美图云修 50 查看详情 美图云修
  • 安装 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)实战的详细内容,更多请关注其它相关文章!


# 多个  # 合肥网站seo策划  # 网站优化有哪些规则  # 网络营销推广宣传方案  # 南阳整合营销推广  # 从化网站自然优化  # 中阳国产网站推广联系方式  # 创意摄影营销推广方式  # 贵州网站优化推广公司  # 网站建设相关资格证  # 宝鸡抖音营销怎么做推广  # 打到  # 解决问题  # 中文网  # 相关文章  # 适用于  # redis  # 有哪些  # 客户端  # 美图  # 如何实现  # red  # .net  # c#开发  # c#  # 热点  # microsoft  # ai  # app  # json  # js 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 在Pyomo中实现基于变量的条件约束:Big-M方法详解  晋江读书网页版在线登录 晋江读书电脑版官网  Tailwind CSS line-clamp 布局问题解析与修复指南  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  最新韩小圈网页版登录入口_官网在线观看官方链接  天眼查企业查询官网入口 天眼查官方网页版查询  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  Django表单提交验证失败后保持字段值不刷新  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  2026春节假期时间安排 2026春节假日查询  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  在命令行怎么运行html项目_命令行运行html项目方法【教程】  word中如何让数字纵向排列_Word数字纵向排列方法  蛙漫移动版在线看 蛙漫手机浏览器直达入口  微信网页版官方入口教程 微信网页版网页版快速登录步骤  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  深入理解J*a合成构造器:何时以及为何阻止其生成  C++如何实现线程池_C++11手动实现一个简单的固定大小线程池  必由学登录入口 必由学官方网站在线访问链接  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  mysql备份恢复性能优化_mysql备份恢复性能优化方法  Python多线程中正确使用sigwait处理SIGALRM信号  J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析  写好的html代码怎么运行出来_运行写好的html代码方法【教程】  深入理解J*aScript中的B样条曲线与节点向量生成  TypeScript/J*aScript:高效查找数组中首个唯一ID对象  Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  Go RPC HTTP服务正确实现与常见陷阱解析  C++如何比较两个字符串_C++ string compare函数与操作符对比  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  微信聊天记录怎么加密_微信聊天记录加密方法  照顾宝贝2小游戏点击立即在线玩  深入理解J*aScript Promise异步执行与微任务队列  优化大型XML文件解析:基于Python流式处理的内存高效方案  EMS快递官网app_中国邮政速递物流手机客户端  解决Django多数据库/多Schema环境下外键迁移问题  必由学官方网站入口 必由学学生教师共用登录通道  J*aScript对象创建方式_J*aScript设计模式应用  如何在J*a中使用Locale处理多语言环境  sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致! 

搜索