我在ASP.NET / C#/ SQL Server 2012中运行一个需要缓存某些存储过程查询结果的网站。结果应该是绝对过期。有什么选择可以做到这一点?
最好设置command.ExpirationDateTime = DateTime.Now.AddMinutes(10)会很棒,但据我所知,这是不可能的。
编辑: 数据将从API返回,因此无法使用页面或用户控件进行缓存。
答案 0 :(得分:1)
查看企业库缓存应用程序块。这具有您正在寻找的确切功能
cache.Add(listid.ToString(), list, CacheItemPriority.Normal, null,
new SlidingTime(TimeSpan.FromMinutes(60)));
答案 1 :(得分:1)
我不理解您对实际执行缓存的限制,但我认为您可以访问HttpRuntime.Cache
?如果是这种情况,我在博客文章(Caching Services - The Lazy Way)中编写了一系列用于缓存服务响应的实用程序。
您可以执行此实用程序的基础知识:
string cacheKey = GenerateCacheKey(myParam); //most likely a derivative of myParam
if (Cache.IsInCache<MyResultType>(cacheKey))
{
return Cache.GetFromCache<MyResultType>(cacheKey);
}
var result = GetMyRequestedResult(myParam);
if (result != null) //or whatever makes sense
{
Cache.InsertIntoCacheAbsoluteExpiration(cacheKey, result, DateTime.Now.AddMinutes(0));
}
return result;
如果您之间有任何服务,帖子会显示一个可爱的课程,用于与这些服务进行交互/缓存。
答案 2 :(得分:0)
我最终通过将命令文本与参数名称和值合并,从SqlCommand创建了一个哈希。我在HttpContext.Current.Cache对象中放入/获取内容时用作缓存键的哈希值。工作良好。可能不是超级快,但由于一些查询稍微慢一点,所以没关系。
答案 3 :(得分:0)
您也可以从.Net Framework 4开始使用System.Runtime.Caching.ObjectCache,而不仅仅是在Web应用程序中。这是一个例子:
List<EmailData> result = null;
ObjectCache cache = MemoryCache.Default;
var key = string.Concat(title, ":", language);
var item = cache.GetCacheItem(key);
if (item != null)
return item.Value as List<EmailData>;
using (var connection = _connectionFactory.OpenConnection())
{
result = connection.Query<EmailData>(sql, new { title, language }).ToList();
}
var cachingPolicy = new CacheItemPolicy
{
AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(_cacheExpirationIntervalInMinutes)
};
cache.Set(new CacheItem(key, result), cachingPolicy);
return result;
您可以阅读更多内容:https://msdn.microsoft.com/en-us/library/system.runtime.caching.objectcache(v=vs.110).aspx