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
相关产品推荐
相关产品推荐

