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

ASP.NET MVC 5:控制器外无法找到Cache对象,如何实现服务器缓存?

嘿,我来帮你捋捋ASP.NET MVC 5里控制器外怎么用服务器缓存存数据库数据~

在ASP.NET MVC 5控制器外实现服务器端缓存的方案

你完全可以不用[OutputCache]特性,下面两个核心缓存对象能满足你在控制器外(比如业务逻辑层、数据访问层)存储数据库数据的需求:

1. HttpRuntime.Cache(ASP.NET传统共享缓存)

这个是ASP.NET生态里沿用很久的缓存对象,整个应用域共享,在任何项目层都能直接调用,和ASP.NET的缓存体系集成度很高。

使用示例:

比如缓存从数据库获取的用户列表:

using System.Web;

public List<User> GetCachedUsers()
{
    // 先尝试从缓存读取
    var cachedUsers = HttpRuntime.Cache["AllUsers"] as List<User>;
    
    if (cachedUsers == null)
    {
        // 缓存未命中,从数据库拉取数据
        cachedUsers = _dbContext.Users.ToList();
        
        // 将数据存入缓存,设置20分钟绝对过期时间
        HttpRuntime.Cache.Insert(
            "AllUsers",
            cachedUsers,
            null, // 可设置缓存依赖(比如文件/数据库依赖),这里暂用null
            DateTime.Now.AddMinutes(20),
            System.Web.Caching.Cache.NoSlidingExpiration
        );
    }
    
    return cachedUsers;
}

注意:这个对象依赖System.Web程序集,如果你未来有迁移到.NET Core的计划,它就不适用了,但在MVC5环境下是完全可靠的选择。

2. MemoryCache(通用.NET缓存方案)

这个属于System.Runtime.Caching程序集下的通用缓存类,不依赖System.Web,不仅能在MVC5里用,还能复用在非Web项目中,灵活性更强。

使用示例:

先确保项目引用了System.Runtime.Caching程序集,然后:

using System.Runtime.Caching;

public List<Product> GetCachedProducts()
{
    var cache = MemoryCache.Default;
    var cachedProducts = cache["AllProducts"] as List<Product>;
    
    if (cachedProducts == null)
    {
        cachedProducts = _dbContext.Products.ToList();
        
        // 配置缓存策略,这里设置30分钟绝对过期
        var cachePolicy = new CacheItemPolicy
        {
            AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(30),
            // 也可以设置滑动过期:SlidingExpiration = TimeSpan.FromMinutes(10)
        };
        
        cache.Set("AllProducts", cachedProducts, cachePolicy);
    }
    
    return cachedProducts;
}

选择建议

  • 如果你的项目是纯ASP.NET MVC5,没有跨平台迁移需求,HttpRuntime.Cache足够简单好用,和ASP.NET体系适配更好。
  • 如果缓存逻辑需要跨项目复用,或者未来有技术栈迁移计划,选MemoryCache更通用灵活。

另外还要注意几个细节:

  • 缓存键要保证全局唯一,避免和其他缓存数据冲突
  • 根据数据更新频率合理设置过期时间,平衡数据新鲜度和性能
  • 当数据库数据更新时,记得手动移除对应缓存项(比如调用HttpRuntime.Cache.Remove("AllUsers")或MemoryCache.Default.Remove("AllUsers")),避免返回旧数据

内容的提问来源于stack exchange,提问作者A. Savva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:38:27