在C#中缓存存储过程结果的最佳方法

时间:2012-11-20 13:53:46

标签: c# sql-server caching stored-procedures

我在ASP.NET / C#/ SQL Server 2012中运行一个需要缓存某些存储过程查询结果的网站。结果应该是绝对过期。有什么选择可以做到这一点?

最好设置command.ExpirationDateTime = DateTime.Now.AddMinutes(10)会很棒,但据我所知,这是不可能的。

编辑: 数据将从API返回,因此无法使用页面或用户控件进行缓存。

4 个答案:

答案 0 :(得分:1)

查看企业库缓存应用程序块。这具有您正在寻找的确切功能

The Caching Application Block

    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