我有必要去缓存对象的集合,是大多是静态的(可能每天1倍的变化),这是在我的ASP.NET Web API的OData服务avaliable。 这个结果集在调用(意思是不是客户端调用具体的),所以它需要在应用层进行高速缓存使用。
我做了一堆关于“在网络API缓存”,但所有的结果都是关于“输出缓存”搜索的。 这是不是我要找的在这里。 我想缓存“人民”收集在后续调用重新使用(可能有一个滑动过期)。
我的问题是,因为这还只是ASP.NET,我使用传统的应用程序缓存技术在内存中坚持此集合,或者是有别的东西,我需要做什么? 此集合不直接返回给用户,而是作为场景,通过API调用的OData查询背后的根源。 没有任何理由让我出去到数据库中每个调用get每次通话完全相同的信息。 牛熊它每小时应该足够了。
任何一个知道如何正确缓存在此方案中的数据?
是的,输出缓存是不是你在找什么。 您可以在内存中的MemoryCache缓存中的数据,例如, http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx 。 但是,如果应用程序池得到回收,你将丢失的数据。 另一种选择是使用分布式缓存像AppFabric的缓存或内存缓存,仅举几例。
该解决方案最后我用参与MemoryCache
在System.Runtime.Caching
命名空间。 这里是结束了对缓存我收集工作的代码:
//If the data exists in cache, pull it from there, otherwise make a call to database to get the data
ObjectCache cache = MemoryCache.Default;
var peopleData = cache.Get("PeopleData") as List<People>;
if (peopleData != null)
return peopleData ;
peopleData = GetAllPeople();
CacheItemPolicy policy = new CacheItemPolicy {AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(30)};
cache.Add("PeopleData", peopleData, policy);
return peopleData;
这里是另一种方式,我发现使用Lazy<T>
考虑到锁定和并发性。 总归功于这个帖子: 如何处理使用的MemoryCache昂贵的建筑施工?
private IEnumerable<TEntity> GetFromCache<TEntity>(string key, Func<IEnumerable<TEntity>> valueFactory) where TEntity : class
{
ObjectCache cache = MemoryCache.Default;
var newValue = new Lazy<IEnumerable<TEntity>>(valueFactory);
CacheItemPolicy policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(30) };
//The line below returns existing item or adds the new value if it doesn't exist
var value = cache.AddOrGetExisting(key, newValue, policy) as Lazy<IEnumerable<TEntity>>;
return (value ?? newValue).Value; // Lazy<T> handles the locking itself
}