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

