我已经阅读了大量关于MVC应用程序中的页面缓存和部分页面缓存的信息。然而,我想知道你将如何缓存数据。
在我的场景中,我将使用LINQ到实体(实体框架)。在第一次调用GetNames(或任何方法)时,我想从数据库中获取数据。我想将结果保存在缓存中,并在第二次调用时使用缓存版本(如果存在)。
谁能举例说明这将如何工作,这应该在哪里实现(模型?),如果它将工作。
我在传统的ASP中见过这种情况。NET应用程序,通常用于非常静态的数据。
我已经阅读了大量关于MVC应用程序中的页面缓存和部分页面缓存的信息。然而,我想知道你将如何缓存数据。
在我的场景中,我将使用LINQ到实体(实体框架)。在第一次调用GetNames(或任何方法)时,我想从数据库中获取数据。我想将结果保存在缓存中,并在第二次调用时使用缓存版本(如果存在)。
谁能举例说明这将如何工作,这应该在哪里实现(模型?),如果它将工作。
我在传统的ASP中见过这种情况。NET应用程序,通常用于非常静态的数据。
当前回答
Steve Smith写了两篇很棒的博文,演示了如何在ASP中使用他的CachedRepository模式。净MVC。它有效地使用存储库模式,并允许您在无需更改现有代码的情况下获得缓存。
http://ardalis.com/Introducing-the-CachedRepository-Pattern
http://ardalis.com/building-a-cachedrepository-via-strategy-pattern
在这两篇文章中,他向你展示了如何建立这种模式,并解释了为什么它是有用的。通过使用这种模式,您可以在现有代码看不到任何缓存逻辑的情况下获得缓存。本质上,使用缓存的存储库就像使用其他存储库一样。
其他回答
HttpContext.Current.Cache.Insert("subjectlist", subjectlist);
我用过这种方法,对我很有效。 https://msdn.microsoft.com/en-us/library/system.web.caching.cache.add (v = vs.110) . aspx system.web. cache. cache.add的参数信息。
public string GetInfo()
{
string name = string.Empty;
if(System.Web.HttpContext.Current.Cache["KeyName"] == null)
{
name = GetNameMethod();
System.Web.HttpContext.Current.Cache.Add("KeyName", name, null, DateTime.Noew.AddMinutes(5), Cache.NoSlidingExpiration, CacheitemPriority.AboveNormal, null);
}
else
{
name = System.Web.HttpContext.Current.Cache["KeyName"] as string;
}
return name;
}
下面是我使用的一个漂亮而简单的缓存助手类/服务:
using System.Runtime.Caching;
public class InMemoryCache: ICacheService
{
public T GetOrSet<T>(string cacheKey, Func<T> getItemCallback) where T : class
{
T item = MemoryCache.Default.Get(cacheKey) as T;
if (item == null)
{
item = getItemCallback();
MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(10));
}
return item;
}
}
interface ICacheService
{
T GetOrSet<T>(string cacheKey, Func<T> getItemCallback) where T : class;
}
用法:
cacheProvider.GetOrSet("cache key", (delegate method if cache is empty));
缓存提供程序将检查缓存中是否有名称为“缓存id”的东西,如果没有,它将调用委托方法来获取数据并将其存储在缓存中。
例子:
var products=cacheService.GetOrSet("catalog.products", ()=>productRepository.GetAll())
适用于。net 4.5+框架
添加reference: System.Runtime.Caching
添加using语句: 使用System.Runtime.Caching;
public string[] GetNames()
{
var noms = System.Runtime.Caching.MemoryCache.Default["names"];
if(noms == null)
{
noms = DB.GetNames();
System.Runtime.Caching.MemoryCache.Default["names"] = noms;
}
return ((string[])noms);
}
在. net Framework 3.5和更早的版本中,ASP。NET在System.Web.Caching命名空间中提供了内存中的缓存实现。在以前版本的. net Framework中,缓存仅在系统中可用。Web命名空间,因此需要依赖于ASP。网类。在. net Framework 4中,System.Runtime.Caching命名空间包含为Web和非Web应用程序设计的api。
更多信息:
https://msdn.microsoft.com/en-us/library/dd997357 (v = vs.110) . aspx https://learn.microsoft.com/en-us/dotnet/framework/performance/caching-in-net-framework-applications
参考系统。并使用System.Web.Caching.Cache
public string[] GetNames()
{
string[] names = Cache["names"] as string[];
if(names == null) //not in cache
{
names = DB.GetNames();
Cache["names"] = names;
}
return names;
}
有点简化了,但我想应该可以。这不是MVC特定的,我一直使用这种方法缓存数据。