You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.Net MVC中C#实现缓存提性能:控制器国家列表缓存问题

嘿,我来帮你把这两种服务器端缓存的实现方式理清楚,还能解决你本地没法测试OutputCache的小困惑~

方式一:使用OutputCache特性

这个特性是ASP.NET MVC原生提供的,配置起来非常省心,你写的代码基本没问题,我把完整的写法补全下:

[OutputCache(Duration = 86400, Location = OutputCacheLocation.Server, VaryByParam = "none")]
public ActionResult GetCountries()
{
    // 这里写获取国家列表的逻辑,比如从数据库查询
    var countryList = GetCountryListFromDb();
    return Json(countryList, JsonRequestBehavior.AllowGet);
}

关于本地测试的小技巧

你说本地客户端和服务器都是本地环境没法测试?其实完全可以测的:

  • 把Duration改成短一点的值,比如60(1分钟),方便快速验证
  • 第一次请求这个接口时,打个断点或者加个日志,确认方法被执行了
  • 1分钟内再次请求,你会发现断点没触发、日志没输出,说明是从服务器缓存里取的内容
  • 等1分钟后再请求,方法又会重新执行,缓存也会刷新

这个特性的优势就是零手动缓存管理,框架会自动帮你处理缓存的存储、过期和清理,非常适合简单的场景。

方式二:使用MemoryCache手动实现

如果需要更灵活的缓存控制(比如自定义缓存键、设置更复杂的过期策略、手动清空缓存),MemoryCache是更好的选择。完整的实现示例如下:

private static readonly MemoryCache _cache = MemoryCache.Default;
private const string CountryCacheKey = "CountryListCache";

public ActionResult GetCountries()
{
    // 先从缓存里取数据
    var countryList = _cache.Get(CountryCacheKey) as List<Country>;

    if (countryList == null)
    {
        // 缓存为空,从数据源获取
        countryList = GetCountryListFromDb();
        
        // 设置缓存过期策略:这里设置24小时后过期,也可以用滑动过期等
        var cachePolicy = new CacheItemPolicy
        {
            AbsoluteExpiration = DateTimeOffset.Now.AddHours(24)
        };
        
        // 将数据存入缓存
        _cache.Set(CountryCacheKey, countryList, cachePolicy);
    }

    return Json(countryList, JsonRequestBehavior.AllowGet);
}

这种方式的优势

  • 完全掌控缓存的生命周期,比如可以在后台更新国家数据后,手动调用_cache.Remove(CountryCacheKey)来清空缓存,让下一次请求自动刷新数据
  • 可以根据不同的业务场景设置不同的缓存策略(比如滑动过期:用户一段时间不访问就过期,访问了就延长有效期)
  • 可以自定义缓存键,支持更复杂的缓存维度
两种方式怎么选?
  • 如果只是简单的“缓存接口返回值,固定时间过期”,选OutputCache就够了,代码少,省心
  • 如果需要自定义缓存逻辑、手动控制缓存,或者缓存的不是整个接口返回值(比如只是缓存数据库查询的结果),选MemoryCache更合适

内容的提问来源于stack exchange,提问作者Bhawna Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:41:42