在网页API缓存数据(Caching Data in Web API)

2019-09-02 06:00发布

我有必要去缓存对象的集合,是大多是静态的(可能每天1倍的变化),这是在我的ASP.NET Web API的OData服务avaliable。 这个结果集在调用(意思是不是客户端调用具体的),所以它需要在应用层进行高速缓存使用。

我做了一堆关于“在网络API缓存”,但所有的结果都是关于“输出缓存”搜索的。 这是不是我要找的在这里。 我想缓存“人民”收集在后续调用重新使用(可能有一个滑动过期)。

我的问题是,因为这还只是ASP.NET,我使用传统的应用程序缓存技术在内存中坚持此集合,或者是有别的东西,我需要做什么? 此集合直接返回给用户,而是作为场景,通过API调用的OData查询背后的根源。 没有任何理由让我出去到数据库中每个调用get每次通话完全相同的信息。 牛熊它每小时应该足够了。

任何一个知道如何正确缓存在此方案中的数据?

Answer 1:

是的,输出缓存是不是你在找什么。 您可以在内存中的MemoryCache缓存中的数据,例如, http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx 。 但是,如果应用程序池得到回收,你将丢失的数据。 另一种选择是使用分布式缓存像AppFabric的缓存或内存缓存,仅举几例。



Answer 2:

该解决方案最后我用参与MemoryCacheSystem.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
}


文章来源: Caching Data in Web API